fscanf函数问题,回答后附送50分

来源:百度知道 编辑:UC知道 时间:2024/05/03 13:44:41
有一道编程如下:
#include <stdio.h>
main()
{int i,flag;
char str[80],c;
FILE *fp;
fp=fopen("text","w");
flag=1;
while(flag==1)
{printf("\nInput string:\n");
gets(str);
fprintf(fp,"%s",str);
printf("\nContinue?");
c=getchar();
if((c=='N')||(c=='n'))
flag=0;
getchar();
}
fclose(fp);
fp=fopen("text","r");
while(fscanf(fp,"%s",str)!=EOF)
{for(i=0;str[i]!='\0';i++)
if((str[i]>='a')&&(str[i]<='z'))
str[i]-=32;
printf("\n%s\n",str);
}
fclose(fp);
}
运行程序时,如果输入“ABC”回车,再输入“DEF”回车,会显示结果“ABCDEF”,但是如果输入的字符串中包含空格,比如输入I AM A STUDENT,结果会将"I" "AM" "A" "STUDENT"这4个字符串分别输出4行上.
书上的解释是用FSCANF函数从文件读入字符串时,把空格作

gets(str); 读取一行字符,直到“\n“,并包括“\n“在内。
所以文件 text 里,输入的一行字符,包括空白间隔都在一行。

输入I AM A STUDENT,文件 text 里是
I AM A STUDENT, 在同一行。

fscanf(fp,"%s",str), 一次从文件读一个字符串,读到空白就不读了。

用while fscanf读时,第一次读入I,第二次读入AM ...

printf("\n%s\n",str); 这里你加了换行符,所以每输出一次都换一次行。

如果改成
while(fscan ...){
..
printf("%s ",str); // 不换行
};
printf("\n"); // 出了while 再换行。
就不会换四行了

对于问题一:\0只是告诉系统这里是字符串尾部,不要继续处理了,所以系统输出到这里就停止了,假如还要换行,就自己加个\n吧

对于问题二:读入I,输出I,然后继续读,发现文件没完,所以读入am,输出am,直至读到student后输出,然后再读,发现读不到,fscanf返回eof的结束标志了,才结束循环

补充题:fscanf换成fgets(fp, str)

按crtl+z好像是可以结束循环

得找专业人士了噢。
呵呵