如何在C语言中使用stdio.h读取文件单词?
我是C新手,没有分段故障,我无法完全掌握它。如何在C语言中使用stdio.h读取文件单词?
这里是我的想法至今:
#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);
}
在你nextWord
功能,你永远不初始化局部变量word
在什么点,所以当你试图写入所指向的内存strcat
,你获得段错误。
您需要分配内存来存储要读取的单词。问题是,你不知道这个词有多大,所以你不知道分配多少空间。有许多可能的方法:
使用(大)固定大小的缓冲区堆栈上举行的话,你读它,然后将其复制到适当大小的malloc分配区域,当你把它返还。如果遇到对于固定大小的缓冲区来说太大的单词,会出现问题。
分配一个小块来读取单词,并跟踪读取字符时使用了多少。块填满后,重新分配它变大。
或者你也可以在你的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变量分配单词。 不要忘记冲洗缓冲区变量
不要使用fscanf来将长度未知的字符串读入固定大小的缓冲区。你想使用一个函数来指定缓冲区的大小。 – dreamlax 2011-03-06 21:29:08
-1:由于fscanf返回匹配的项目数(在本例中通常总是1),而不是读取的任何东西的长度,所以这几乎总是会崩溃。另外,如果该单词对于缓冲区来说太长,则会发生不好的事情。 – 2011-03-06 22:55:51
strcat不是你想要的。在你遵循克里斯的建议并且将单词指向一个实际的缓冲区之后,你应该做一些像[i ++] = c的事情; (或者,通常* word ++ = c并且有另一个指针保持跟踪缓冲区的开始) – 2011-03-06 20:48:37