在循环读入字符时,总会出现在输出时出现很多换行符的问题。
例子1:
#include<stdio.h>
int main()
{
char c;
while(1)
{
c=getchar();
printf("%c\n",c);
}
return 0;
}
例子2:
#include<stdio.h>
int main()
{
char c;
while(1)
{
scanf("%c",&c);
printf("%c\n",c);
}
return 0;
}
上面两个例子都会在输入时造成这样的结果:
当我输入一个a,按下一个回车,最后它先输出一个a,然后换行了三次,光标移到了第5行。
问题的理解:
实际上当我们按下回车时,回车会在输入栏中被等效成一个换行符,所以在回车过后光标会移动到下一行。也就是说实际上输入的不止是a,等效的输入应该是
a'\n'
换种说法,\n被存在了输入缓存区里。
程序接下来就变成了,读入一个a输出一个a再换一行。读入一个'\n'输出一个换行符,再输出输出函数内的一个换行符。一共换行三次。
方案的解决:
问题的关键出现多了一个换行符。
解决1:
#include<stdio.h>
int main()
{
char c;
while(1)
{
c=getchar();
putchar(c);
}
return 0;
}
去掉了printf() 中的换行符,将读入的换行符直接putchar
解决2:
#include<stdio.h>
int main()
{
char c;
while(1)
{
scanf(" %c",&c);
printf("%c\n",c);
}
return 0;
}
在scanf()的%c前加上一个空格,这个的具体原理我也不明白,欢迎交流指导。
我的理解是scanf中的空格就是将空格清理,换行符也在其中,所以读入c变量中的字符不在具有换行符,
当然啦,还有另一些解决思路:
比如scanf("%s",a)可以直接读到空格或换行符就终止,不会使数组a中出现空格或换行符
也可以用gets()和puts() 或者 fgets()和fputs()。但千万不要混着使用,因为gets读到换行符就会终止,而puts会自动输出一个换行符。而fgets正好相反,fgets读入换行符,fputs直接输出,不加入换行符。
希望有需要的人看到这个解答后能自己去实验一下。总结理解提升。一起进步吧(*^_^*)。
这是我的第一篇博客,分享交流从这里开始吧。(纯萌新,有问题或者想法欢迎提出指正😘)。