2017-12-24 11 views
-4

namesの配列にいくつの名前があるのか​​探したい。私はsizeof(names)/sizeof(names[0])が正しい答えを与えることを知っています。しかし、問題は私がちょうどchar *names[];を宣言することはできません。コンパイラが私にこのようなエラーを与えるので"名前の記憶は不明"。このエラーを回避するには、このように宣言する必要がありますchar *names[] = {"somename", "somename2"};。しかし、問題は、減速の直後に文字列を割り当てることができないことです。私はいくつかの条件の後に文字列を割り当て、私の問題は、その条件の後にいくつの文字列があるかということです。文字列配列の要素数はいくつですか?

私の例です。アレイが作成されると

char *names[]; 
char word[10]; 
int i = 0; 
while (fscanf(word, sizeof(word), fp)>0) { 

    // Think hello increase every time loop returns. 
    // such as "hello1", and the 2nd time "hello2" 
    if(strcmp(word, "hello1") == 0) 
    names[i] = word; 
    } 
    printf("size: %d\n", sizeof(names)/sizeof(names[0])); 
+2

次に、 'malloc'を使って動的に記憶域を割り当てます。 –

+0

何もわかりません(* to me *)。あなたは試したことの例を見せていただけますか? – coderredoc

+0

@OliverCharlesworthどうすれば 'malloc'を使うことができますか? –

答えて

0

アレイサイズはに固定されています。変更することはできません。


fpを2回読むことができる場合は、単語カウントのためにファイルを1回読みます。

size_t word_count = 0; 
int word_length_max = 0; 

long pos = ftell(fp); // remember file location 
int n = 0; 
while (fscanf(fp, "%*s%n", &n) != EOF && n > 0) { // Use %n to record character count 
    word_count++; 
    if (n > word_length_max) { 
    word_length_max = n; 
    } 
    n = 0; 
} 

コードでは、必要なアレイサイズと最大長がword[]です。

char *words[word_count]; 
char word[word_length_max + 1u]; // buffer size needed to read in the words 

fseek(fp, pos, SEEK_SET); // go back 
for (size_t i=0; i<word_count; i++) { 
    if (fscanf(fp, "%s", word) != 1) { 
    Handle_UnexpectedError(); // 2nd pass should have same acceptable results 
    } 
    words[i] = strdup(word); // allocate a duplicate 
} 

words[]で完了した場合は、必ず割り当てられたメモリを解放してください。

.... 
for (size_t i=0; i<word_count; i++) { 
    free(words[i]); 
} 

より良いコードもエラーのftell(), fseek(), malloc()の戻り値をチェックし、fscanf(fp, "%s", word)を制限します。

関連する問題