0

各単語の単語と数を配列に格納しようとしていますstruct word

struct word{
    char str[MAX_WORD_LENGTH];
    int num;
}

inputFile = fopen("wordstat.txt", mode);
if(inputFile == NULL){
    printf("Cannot open file\n");
    return 1;
}

//scan through file to count number of possible words
while(fscanf(inputFile, "%s", scan)){
    wordCount++;
}

rewind(inputFile);

struct word *words = malloc(wordCount * (sizeof *words));

文字列にアクセスしてメンバー変数 str に格納するにはどうすればよいですか? malloc を実行する前に初期化する必要がありますか?

4

3 に答える 3

1
struct word *words = malloc(wordCount * (sizeof *words));

word構造体の 1 次元配列を効果的に作成します。これには、配列表記法words[i].strまたはポインター表記法(words + i)->strを使用してアクセスし、エントリ 'i' にアクセスできます。

文字列 (呼び出しから返されたものなど) を格納するには、それらを構造体scanfの 1 つにコピーします。word

fscanf( inputFile, "%s", scan );
strncpy( words[i].str, scan, MAX_WORD_LENGTH );

それぞれの文字列のメモリstruct wordは、malloc を実行するときに割り当てられます。

于 2013-01-25T05:04:43.627 に答える
0

wordsポインターまたは配列としてアクセスできます。

words[0]

最初の構造体です。

words[0].str

最初の言葉です。そして、すべての単語を反復するには:

for (int iWord = 0; iWord < wordCount; ++iWord)
{
    // words[iWord] is the current word
    printf("%s", words[iWord].str);
}

ポインターを好む場合 (この場合は好みません)、次のようにします。

(words+5)->str

これは 6 番目の単語です (番号は 0 から始まることに注意してください)。ただし、次のようなポインターを使用できます。

for (struct word *pWord = words; pWord < words+wordCount; ++pWord)
{
    // pWord is the current word
    printf("%s", pWord->str);
}
于 2013-01-25T05:00:48.620 に答える
0

まず、最後の行は

struct word *words = malloc(wordCount * sizeof(word));

この行で宣言している変数ではなく、単語構造体のサイズが必要です...

wordsそれを超えて、次のように、各構造体を適切なデフォルト値に初期化する必要があります。

words[0].num = 0; // or any values you please, really
words[0].str[0] = '\0';
于 2013-01-25T05:02:54.617 に答える