2

私のコードでは、 for ループの初期化部分で変数を初期化できません。このコードを書くとき:

    long unsigned int arr[3][3];
char str[50];
for(;gets(str);)
{
    int temp=0;
    for(int i,j,k=0; str[k]!='\0'; k++){ if(str[k]!=' ')temp=temp*10+(str[k]-48);

コンパイラが示しています

error: 'for' loop initial declarations are only allowed in c99 mode

それが何を意味するのかわかりませんが、次のようにコードを書くと:

    long unsigned int arr[3][3];
char str[50];
for(;gets(str);)
{
    int temp=0;
    int i,j,k=0;
    for(; str[k]!='\0'; k++){ if(str[k]!=' ')temp=temp*10+(str[k]-48);

それは正常に動作します。なぜこうなった?

4

3 に答える 3

5

のようなループで変数を宣言する

for (int i = 0; ...; ...)

C99 標準では新しく、以前の標準では許可されていませんでした。forエラー メッセージが示すのは、コンパイラが以前の標準を使用してコンパイルするように設定されているため、ステートメント内で宣言を使用できないことです。

ステートメント内から宣言を削除するかfor、コンパイル時に新しい標準を使用するようコンパイラーに指示する必要があります。-std=c99GCCまたはclangを使用している場合、フラグを追加することで、コンパイラに新しいバージョンを使用するように指示できます。

于 2013-10-20T14:24:21.017 に答える
2

C89 のみをサポートするコンパイラを使用しているか、コンパイラが C89 のみをサポートするモードになっています。変数の宣言は、C89 のブロックの先頭にある必要があります。C99 や C++ ではもはや制限ではありません。

C99 モードに変更するか、ブロックの先頭に , i,jの宣言を入れてください。kそれらを初期化する方法が正しくないように見えます。初期化しただけkです。

for(;gets(str);)
{
    int temp=0;
    int i,j,k;
    for(i=0,j=0,k=0; str[k]!='\0'; k++){ if(str[k]!=' ')temp=temp*10+(str[k]-48);

gets危険ですので、fgets代わりに使用してください。

于 2013-10-20T14:23:48.223 に答える
1

これは、以前のコードが、コードをコンパイルする C 標準に従っていないために発生します。C (または C++) コンパイラのマニュアルで、C99 標準でのコンパイルを有効にする方法 (可能な場合) を確認してください。GNU コンパイラの場合は-std=c99スイッチです。

于 2013-10-20T14:24:21.280 に答える