2

intC では、配列のリストから配列を選択するためのカウンターとしてan を使用できるかどうか疑問に思っています。そうでない場合、どのようにこれを回避することをお勧めしますか? 申し訳ありませんが、コードはそれをよりよく説明するかもしれません:

編集:申し訳ありませんが、inputchar は単一の文字であると明確にする必要がありました。inputchar が配列内のいずれかの単語の文字であるかどうかを確認しようとしています。

int i;

char word0[] ={'c','a','c','h','e'};
char word1[] ={'i','n','t','e','l'};
char word2[] ={'e','t','h','e','r','n','e','t'};
char word3[] ={'g','i','g','a','b','y','t','e'};
char word4[] ={'l','i','n','u','x'};

for (input = 0;input<i;input++)
{
    if (inputchar==word(i)[input] /*this is the problem here, i want to use the int (i) to chose the array, i is randomized before this in the program */
    {
        w(i)[input]=inputchar;
        lc++;
        printf("You guessed correct! continue on word master");
    }
}
4

5 に答える 5

3

あなたが持っているものへの最も簡単な変更は、既存の配列のそれぞれへのポインタの配列を作成することです:

char *words[] = { word0, word1, word2, word3, word4 };

配列はヌル終端されていないため、それらの長さも知る必要があり、からアクセスすることはできませんwords:

size_t wordlengths[] = { sizeof(word0), sizeof(word1), sizeof(word2), sizeof(word3), sizeof(word4) };

しかし、あなたのコードが、非終端文字データを含む異なるサイズの 5 つの異なる書き込み可能配列を持つことに実際に依存していない場合は、より適切に実行できる可能性があります。

于 2012-11-21T18:06:33.807 に答える
1

文字列 (ポインター) の配列を使用しないのはなぜですか?

char* words[5];

次に、個々の文字列を割り当てます。

words[0] = "cache";
words[1] = "intel";
words[2] = "ethernet";
words[3] = "gigabyte";
words[4] = "linux";

これで、配列インデックスを使用してアクセスできます。

words[i][input]
于 2012-11-21T17:54:32.513 に答える
1

トリックは変更することです:

char word0[] ={'c','a','c','h','e'};
char word1[] ={'i','n','t','e','l'};
char word2[] ={'e','t','h','e','r','n','e','t'};
char word3[] ={'g','i','g','a','b','y','t','e'};
char word4[] ={'l','i','n','u','x'};

例えば:

char word[5][10] = { "cache",
                     "intel",
                     "ethernet",
                     "gigabyte",
                     "linux" };

そして、例えば書くことができます

    if (inputchar == word[i][input])
        ...
于 2012-11-21T17:54:42.853 に答える
1

最も簡単な回避策は、配列の配列です。

char word[][9] = {"cache", "intel", "ethernet", "gigabyte", "linux"};

wordこれは、 の 9 要素配列の 5 要素配列として宣言しcharます。5 は初期化子の項目数から決定され、9 は最長の文字列 (8 文字と 0 ターミネータ) を保持するために必要です。

これは、1 弦、2 弦、5 弦に未使用のスペースがあることを意味しますが、このような演習では、おそらく大したことではありません。数千の文字列を扱っている場合は、ポインターの配列を宣言してから、各文字列を個別に割り当てて、各文字列が必要とするだけのメモリしか使用しないようにすることをお勧めします。

char *word[N]; // for N strings;
...
word[i] = malloc(length_of_string_for_this_element + 1);
if (word[i])
  strcpy(word[i], string_for_this_element);

完了したら、単語ごとにそのメモリを解放する必要があります。

for (i = 0; i < N; i++)
  free(word[i]);

いずれにせよ、特定の文字に次のようにアクセスします

word[i][input]
于 2012-11-21T18:29:22.680 に答える