1

これは、次の投稿されたソリューションを参照しています 。Cでサイズを定義せずに固定サイズの配列をループする

これが私のサンプルコードです:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    static const char *foo[] = {
           "this is a test",
           "hello world",
           "goodbye world",
           "123", 
           NULL
    };

    for (char *it = foo[0]; it != NULL; it++) {
        printf ("str %s\n", it);
    }

    return 0;

}

これをコンパイルしようとすると、次のようになります。

gcc -o vararray vararray.c
vararray.c: In function ‘main’:
vararray.c:14: warning: initialization discards qualifiers from pointer target type
vararray.c:14: error: ‘for’ loop initial declaration used outside C99 mode
4

5 に答える 5

7

forループでの初期化に加えて、間違った場所でインクリメントしています。私はこれがあなたの言っていることだと思います(私は正確にはCの第一人者ではないことに注意してください):

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    static const char *foo[] = {
           "this is a test",
           "hello world",
           "goodbye world",
           "123", 
           NULL
    };
    const char **it;
    for (it=foo; *it != NULL; it++) {
        printf ("str %s\n", *it);
    }

    return 0;

}
于 2009-12-28T14:40:11.467 に答える
6
  1. ループ変数itは型char*であり、配列の内容は型const char*です。あなたitがまた警告になるように変更した場合const char*、警告は消えるはずです。

  2. itforステートメント内で宣言します。これは、C99より前のCでは許可されていません。代わりitに最初に宣言してください。または、gccフラグにまたはを 追加して、C99言語機能を有効にすることもできます。main()
    -std=c99-std=gnu99

于 2009-12-28T14:36:30.977 に答える
1

機能を使用-std=c99するためにコードをコンパイルするときにオプションを使用しC99ます。

itタイプに変更const char*(警告を削除するため)

于 2009-12-28T14:36:11.180 に答える
0

C99より前では、forループで文字ポインタを宣言することは非標準です。

于 2009-12-28T14:36:08.013 に答える
0

警告なしでこのコンパイルを行うには、2つのことが必要です。イテレータconst char* itを宣言し、ループステートメントではなく関数の先頭で実行します。

于 2009-12-28T14:36:22.927 に答える