0

c 我想使用 fscanf 读取以下格式的文件。

 //text file
 push i
 push o
 pop
 push i
 pop 
 push a

一个单词,然后是一个由空格分隔的字符。然后将单词分配给指针或变量,对于字符也是如此。但我不断收到分段错误错误。

FILE * fp("text.txt", "r");
char * word = malloc( 21 * sizeof *word );
char data;
int c, size , i, prev;
while(fscanf(fp, "%s %c[^\n]", word, data) != EOF) {
    printf("%s %c", word, data);
}
4

2 回答 2

2

指针data未初始化,因此当fscanf尝试取消引用它时,您会得到段错误。

你应该做的只是将它声明为 a char(不是 a char *),并将最后一个fscanf参数更改为&data

while(fscanf(fp, "%s %c[^\n]", word, &data) != EOF) {
                                     ^

此外,printf应该%c用于第二个说明符,而不是%s(因为您正在打印单个字符)。

于 2013-09-29T17:40:20.267 回答
0

一个问题是您试图读取一个单词后跟一个字符,但有些行在单词后面没有字符。 fscanf这不是一个好的选择,因为它不擅长区分空格和换行符——两者都只是考虑“空白”,所以它会读取多行以匹配其模式,而忽略换行符。

相反,读取行,fgets然后使用sscanf来解析每一行。

如果你真的必须使用 fscanf,你可以使用类似的东西:

do {
    rv = fscanf(fp, "%s%*[ ]%c", word, &data);
    if (rv == 1) {
        /* read just a word -- no data character after it */
    } else if (rv >= 2) {
        /* read a word and a data character */
    }
} while (rv != EOF);

但这变得复杂了。

于 2013-09-29T20:48:20.837 回答