我是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);
}
答案 0 :(得分:1)
在nextWord
函数中,您永远不会初始化局部变量word
以指向任何内容,因此当您尝试使用strcat
写入指向的内存时,您将得到一个段错误。
您需要分配内存来存储您要阅读的单词。问题是,你不知道这个词有多大,所以你不知道要分配多少空间。有许多可能的方法:
在堆栈中使用(大)固定大小的缓冲区来保存单词,然后在返回时将其复制到适当大小的malloc区域。如果遇到对于固定大小缓冲区来说太大的单词,则会出现问题。
分配一个小块来读取单词,并跟踪读取字符时使用的数量。当块已满时,将其重新分配为更大。
答案 1 :(得分:-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 变量分配单词。 不要忘记刷新缓冲区变量