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返回读取的字符数。所以我要做的第一件事就是保存那个值。如果word为 NULL,则使用字符数分配它,否则使用previous_size变量分配 word。不要忘记刷新缓冲区变量

于 2011-03-06T20:59:28.937 回答