C99モード以外で、静的に割り当てられた配列をループしますか?

StackOverflow https://stackoverflow.com/questions/1969706

  •  21-09-2019
  •  | 
  •  

質問

これは、上に投稿されたソリューションに関連しています。 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
役に立ちましたか?

解決

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;

}

他のヒント

  1. ループ変数 it タイプです char*, 、配列の内容はタイプです const char*. 。変更した場合 it また、 const char* 警告は消えるはずです。

  2. あなたは宣言します it 声明の内部では、これはC99以前にCでは許可されていません。宣言する it の初めに main() 代わりは。
    または、追加することもできます -std=c99 また -std=gnu99 GCCフラグにC99言語機能を有効にします。

使用する -std=c99 使用するためにコードをコンパイルするときのオプション C99 特徴。

変化する itconst char* タイプ(警告を削除する)

C99の前に、forループでのキャラクターポインターが非標準であると宣言します。

警告なしにこのコンパイルを使用するには2つのことが必要です。 const char* it, 、ループステートメントではなく、関数の先頭にそれを行います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top