读书人

这个题是咋回事不明白

发布时间: 2012-03-12 12:45:33 作者: rapoo

这个题是怎么回事,不明白!
从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个“#”为止。
#include<stdio.h>
main()
{FILE*fp;
char ch,filename[10];
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{printf("cannot open file\n");
exit(0);}
ch=getchar();
ch=getchar();
while(ch!='#')
{
fputc(ch,fp);putchar(ch);
ch=getchar();
}
fclose(fp);
}
黑体的这个地方,些语句用来接收在执行scanf语句时最后输入的回车符。我不明白,为什么要接收它,还有,为什么只接收它?执行scanf时,又不是只输入了一个回车符,还输入了文件的名称,为什么不接收名称,只接收它?

[解决办法]
scanf会读取输入信息,但是会有一个换行符剩余,所以要将这个换行符读出来,避免对下一次读取产生影响
[解决办法]
scanf("%s",filename);
scanf是不会将回车换行符读入到变量filename里的.
scanf只有在控制传为%c时,才能读入空字符(如回车,空格,跳格等).
也就意味着在输入文件名如1.txt后,然后输入回车。
scanf读取1.txt。
而键盘缓冲区里海留有一个回车符.
这就是为什么要用一个
ch=getchar();
来吸收回车换行字符原因.

[解决办法]
{printf("cannot open file\n");
exit(0);}
ch=getchar();
ch=getchar();

粗体的部分是读取scanf剩下的换行符,粗体部分的ch的值 永远是0xA。
[解决办法]
getchar 和 scanf 都是用户输入回车后才返回的,也就是说键盘输入缓存里或许还有别的。
不过再加一个getchar未必能解决什么问题,还是把标准输入flush一下比较好。
[解决办法]
二三楼已经基本回答清楚了。我来补充一点:scanf %s的作用是,越过前面的空白(包括空格,Tab,\n),读取内容,到后面的空白之前停下。意思是如果你输入“ abc.txt ”然后按回车,那么流中就会剩下字符'c'后面的那个空格,还有你最后敲入的\n。所以scanf的设计其实是很烂的……

你这种方法也不好,因为在这种情况下一次getchar的调用只能读走空格,还是把\n留在了流中……

更好的方法是:scanf("%s ", filename),注意%s后面的那个空格,它表示读取任意长度的空白,这样可以将上述情况中的多余字符全部去除。
[解决办法]

探讨

引用:
还有这个程序
main()
{ char c;
scanf("%c",&c);
printf("%c",c);
}
当我输入h回车的时候,C只能存一个字符,那这个回车存到哪去了呢?
回车依旧保留在键盘缓冲区里。
如果后面还有接受键盘输入的地方,未调整标准输入流之前,必定是先读取缓冲区里的回车符号.
程序结束后,标……

读书人网 >C语言

热点推荐