与gets()的再一次邂逅(C/C++)
我才知道:gets(str)的作用是从输入缓冲区中读取一个字符串存储到字符指针变量str所指向的内存空间中。
我们也知道:回车键 算作一个字符。
我们知道:a 算作一个字符。
我们知道:gets()函数可以接收一个字符串也可以只接收一个字符。
我们知道:abcde 算作一个字符串。
我们知道:abcde回车键 算作一个字符串。
那么我们应该知道:回车键abcde 算作一个字符串。
我们可以模糊的感觉到:回车键 在dev-c++的控制台中算作 空一行。
进入正题:
int main()
{
int n;
char a[1000];
cin>>n;
while(n--){
gets(a);
strrev(a);
puts(a);
}
return 0;
}
如上述这段代码,她的作用是逆转多个字符串。
我们想象着运行她一下:
输入2,按下回车键,输入ssa(结果:打印出ass),输入love(结果:打印出evol),程序结束。
然后我们来真实地运行一下:
结果好像不尽人意,输入数字2后,只输入一个字符串ssa然后程序及运行结束了。
是不是循环只进行了一次呢?我可以很负责任的告诉你,循环进行了两次。
那是什么地方出错了。我凭着之前的一篇文章已经初窥门径。有没有发现2和ssa之间有一空行。我们暂且称之为1.5
如果你细心的发现了这个1.5并且分析了她,那么你真的很NB。
我给分析一下:
我们输入2之后,按下回车键,此时n对应的为2,且缓冲区中有一个多出来的没人接收的字符回车键,因为n=2,进入循环,gets()函数发挥作用,接收了这个回车键,然后调用strrev函数,然后puts();n--后n=1,进入循环,gets()函数接收了ssa,然后strrev(),然后puts(),n--后n=0,结束循环,这就造成了我们看到的这个结果。
现在知道原因了吧。
如何解决呢,最简单的是在gets()之前把缓冲区中的这个回车键给“消灭掉”,使她不占用我们gets(),这样我们的gets()函数就能准确的接收两个我们输入的字符串。具体做法为:
int main()
{
int n;
char a[1000];
cin>>n;
getchar();
while(n--){
gets(a);
strrev(a);
puts(a);
}
return 0;
}
使用getchar()后,回车键就先被getchar()“消化掉”了,就不会影响我们之后的输入。
运行结果:
拜!