0

私はCが初めてで、セグメンテーション違反なしでは完全に取得できません。

これまでの私の考えは次のとおりです。

#include<stdio.h>
#include<string.h>

char *nextWord(FILE *stream) {
    char *word;
    char c;

    while ( (c = (char)fgetc(stream)) != ' ' && c != '\n' && c != '\0') {
        strcat(word, &c);
    }

    return word;
}

int main() {
    FILE *f;
    f = fopen("testppm.ppm", "r");
    char *word;
    word = nextWord(f);
    printf("%s",word);
} 
4

2 に答える 2

1

関数では、nextWordローカル変数wordを初期化して何かを指すことはないため、ポイントされたメモリにを使用して書き込もうとするとstrcat、セグメンテーション違反が発生します。

読み取る単語を保存するためにメモリを割り当てる必要があります。問題は、その単語の大きさがわからないため、割り当てるスペースがわからないことです。考えられるアプローチはいくつかあります。

  • スタック上の(大きな)固定サイズのバッファーを使用して、単語を読み取るときに単語を保持し、それを返すときに適切なサイズのmallocされた領域にコピーします。固定サイズのバッファに対して大きすぎる単語に遭遇した場合、問題が発生します。

  • 単語を読み込むための小さなブロックを割り当て、文字を読み取るときに使用された量を追跡します。ブロックがいっぱいになったら、ブロックを再割り当てして大きくします。

于 2011-03-06T20:07:20.543 に答える
-1

または、whileループでfscanf関数を使用することもできます。

 char *nextWord(FILE *stream) {  
    char *buffer[124], *word;
     int previous_size = 0;

     while(!feof(!stream)){
         int n = fscanf(file, "%s", buffer);
         if(word == NULL){
            word = malloc(sizeof(char)*n)
         } else {
           realloc(word, n + previous_size);
         }
         strncat(word, buffer, strlen(buffer) - 1);        
         previous_size = n;
      }
      return word;

 }

少し説明。関数fscanfは、読み取られた文字数を返します。だから私が最初にすることはその価値を保存することです。単語がNULLの場合は文字数で割り当て、そうでない場合はprevious_size変数で単語を割り当てます。バッファ変数をフラッシュすることを忘れないでください

于 2011-03-06T20:59:28.937 に答える