读书人

C语言fscanf的一个有关问题

发布时间: 2013-01-06 15:44:47 作者: rapoo

C语言fscanf的一个问题
下面程序是《C Primer Plus》上的一个例子。请问words数组在下面程序的作用是什么?我的理解是它是作为临时储存数据的,但是在程序中的第二个while循环中(即while (fscanf(fp,"%s",words) == 1)),不断从文件中读取数据储存到数组, 而数组最大只能容纳40个字符,但文件中的字符超过了40个,为什么还是能够正常输出?


#include <stdio.h>
#include <stdlib.h>
#define MAX 40

int main(void)
{
FILE *fp;
char words[MAX];
char ch ;
int len ;

if ((fp = fopen("wordy", "a+")) == NULL)
{
fprintf(stdout,"Can't open \"words\" file.\n");
exit(1);
}

puts("Enter words to add to the file; press the Enter");
puts("key at the beginning of a line to terminate.");
while (gets(words) != NULL && words[0] != '\0')
{
fprintf(fp, "%s ", words);
}

puts("File contents:");
rewind(fp);
while (fscanf(fp,"%s",words) == 1)
{
puts(words);
}

if (fclose(fp) != 0)
fprintf(stderr,"Error closing file\n");

return 0;
}

[解决办法]
引用
(即while (fscanf(fp,"%s",words) == 1)),不断从文件中读取数据储存到数组, 而数组最大只能容纳40个字符,但文件中的字符超过了40个,为什么还是能够正常输出?


每次都是一(按空格隔)到words中,然後出,只要不超40字符就不溢出。
下一次上一次的取得。

[解决办法]
hile (gets(words) != NULL && words[0] != '\0')

因为gets的原因,这是一个很危险的库函数了,尽量使用fgets吧
[解决办法]
就是将原来读入的字符从前面开始覆盖

引用:
引用:引用(即while (fscanf(fp,"%s",words) == 1)),不断从文件中读取数据储存到数组, 而数组最大只能容纳40个字符,但文件中的字符超过了40个,为什么还是能够正常输出?

每次都是一(按空格隔)到words中,然後出,只要不超40字符就不溢出。
下一次上一次的取得。
……

[解决办法]
fscanf每次只读一个字符串,遇到空格,回车换行等即停止。
下一次读取重新填充。
所以单个字符串不超过40 字符是没问题的。
因为你用,gets多次向文件写数据,并且注意到,
while (gets(words) != NULL && words[0] != '\0')
{ fprintf(fp, "%s ", words); }

%s都有加一个空格,所以fscanf是可以正常输出的。

你可以把%s后面的空格去掉再试试。

读书人网 >C语言

热点推荐