2012-04-17 15 views
0

私はちょうど奇妙な問題に遭遇しました。文字列の奇妙なC

このコードは動作します:

int l = strlen(output); // l = 20 (believe me) 
char withoutLeadingZeroes[20] = ""; 

、これはしません:私はこのエラーを取得しています

int l = strlen(output); // l = 20 (believe me) 
char withoutLeadingZeroes[l] = ""; 

配列初期化子は、リテラルの初期化子リストや文字列でなければなりません

私は本当にそれを得ていません。助言がありますか?あなたは、変数を使用することによって、このように任意の型の静的な配列を初期化することはできません

+0

「それは機能しません」とはどういう意味ですか? – cnicutar

+2

"うまくいかない"というのは、プログラミング上の問題についてはほとんど役に立ちません。あなたが見る結果は何ですか? – FatalError

+2

も参照してください。http://stackoverflow.com/questions/6634888/why-cant-i-initialize-a-variable-sized-array – Matt

答えて

2

:-)ウィーンから ご挨拶。それはconstでなければなりません、私は信じます。

VS2010: error C2057: expected constant expression

+2

constだけでなく、コンパイル時定数も必ずしも同じものである必要はありません。 – Matt

+0

まあ、あなたが正しいと思います。私はキーワードのように "const"に焦点を当てていませんでしたが、それに応じて書きます。 –

+0

ありがとう、この場合には「L」は20 –

0

Cは標準VLAがで得たものをCに多分C99以降はわからない、VLA(可変な長さの配列)をサポートしていません

提案:。

int len = strlen(output); 
char * wo_zeros = (char *)malloc(len); 
strcpy(wo_zeros, ""); 
//do something with wo_zeros 
free(wo_zeros); 
+0

あなたは大丈夫です、申し訳ありません!私はXcode(最新版)を使用していますが、エラーは「配列初期化子は初期化子リストまたは文字列リテラルでなければなりません。 –

+0

大丈夫ですが、どうしてあなたはごめんなさい? –

+0

これは私の最初の投稿でしたので、いくつかの本質を忘れました。 –

1

Online C99 Standard (n1256)

6.7.8初期化
...
3初期化するエンティティのタイプは、不明なサイズの配列または可変長配列タイプではないオブジェクトタイプ でなければなりません。

宣言char withoutLeadingZeroes[l] = "";可変長配列としてwithoutLeadingZerosを宣言し、あなたがここでやっているとして、それを初期化しようとすると、制約違反です。

診断は、しかし、ビット明確であってもよいです。

編集

あなたはエラーを取得したライン正確指摘することはできますか?私はgccで非常に明確な診断を得て、私はと思った。 XCodeはgccをボンネットの下で走らせた。

+0

ありがとうございます。エラーは、 "配列初期化子はイニシャライザリストまたは文字列リテラルでなければなりません"前の行で "int l = 20"を実行するとエラーが発生しますが、 "const int l = 20"を実行すると動作します。それは私が本当に理解していないものです。 (lの値はコンパイル時にわかります!) –

+0

Whoa。これをCまたはC++としてコンパイルしていますか?そしてエラーは正確な行番号を与えますか? –

+0

ハッ。明らかに私はgccを使ってXcodeについて間違っています。 3.2以降、LLVMとclangを使用しています。毎日何か新しいことを学ぶ。 –