C语言中换行符问题

在缓冲输入中,换行符的确是个麻烦的问题,在这里做一个总结。
1.getchar()
记住:getchar()函数 读取每一个字符!每一个!包括空格,制表符和换行符。
错误代码:
while(getchar()!='y')
printf("Well,then it is %d?\n",++guess);
这里会出现输入一个n,但是出现两句“Well……”
原因是因为换行符也被传输进去了。
换行符当然不等于'y',所以输出两次!
正确代码:
while(getchar()!='y')
{
printf("………");
while(getchar()!='\n')
continue;
}


2.scanf()
记住:scanf()读取数字时会跳过空格,制表符和换行符。并且是把换行符 留在输入队列中!是留在!!!
如果读取数字时,你输入了非数字的字符,那么它也是把它留在输入队列!是留在!!!
错误代码:
while((ch=getchar())!='\n')
{
scanf("%d %d",&a,&b);
display(a,b,ch); //一个函数
}
输入一次运行正常,但到第二次,就不正常了。还没等你输入,就退出了。
原因就是scanf()把换行符留在了队列中,所以当输入ch后,按下了回车,输入队列中还剩下了'\n'
但是,scanf是不读'\n'的。所以第二次执行while循环时,getchar读取的是'\n'。所以就退出了。
正确代码:
while((ch=getchar())!='\n')
{
scanf("%d %d",&a,&b);
while(getchar()!='\n')
continue;
display(a,b,ch);
}
3.gets()
记住:gets()是输入一整行的。它是 丢弃换行符!记住,是丢弃!!!而puts()是自带换行符的。所以二者搭配使用。
使用gets()的危险在于,可能会导致缓冲区溢出(buffer overflow)。如果这些多余的字符擦去了重要程序数据,会导致程序异常中止!
4.fgets()
记住:fgets()会把换行符放在字符串末尾!也就是 读取换行符!!!而fputs()不会自带换行符,所以二者搭配使用。
另外,fgets()有三个参数,第一个是数组地址,第二个是读入字符最大数量,第三个是指明要读入的文件。
错误代码:
fgets(words,SLEN,stdin);
puts(words);
这会导致多个空行!
应该改成fputs(words);
如何处理掉fgets()中读取的换行符?
(1)
int i=0;
while(words[i]!='\n')
i++;
words[i]='\0';
(2)
如果你想舍弃未读取的字符,干脆
while(getchar()!='\n')
continue;
简单粗暴,换行符也一同没了。
4.gets_s()
记住:gets_s()函数读到换行符,是 舍弃!舍弃啊!!!
另外,gets_s()只有两个参数,因为只从标准输入中读取数据,所以跟fgets()相比不需要第三个参数。





你可能感兴趣的:(C/C++)