首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言fscanf的一个有关问题

2013-01-06 
C语言fscanf的一个问题下面程序是《C Primer Plus》上的一个例子。请问words数组在下面程序的作用是什么?我的

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后面的空格去掉再试试。

热点排行
Bad Request.