欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

与gets()的再一次邂逅(C/C++)

程序员文章站 2022-05-28 22:21:56
...

我才知道: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),程序结束。

然后我们来真实地运行一下:

与gets()的再一次邂逅(C/C++)

结果好像不尽人意,输入数字2后,只输入一个字符串ssa然后程序及运行结束了。

是不是循环只进行了一次呢?我可以很负责任的告诉你,循环进行了两次

那是什么地方出错了。我凭着之前的一篇文章已经初窥门径。有没有发现2和ssa之间有一空行。我们暂且称之为1.5

与gets()的再一次邂逅(C/C++)

如果你细心的发现了这个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()“消化掉”了,就不会影响我们之后的输入。

运行结果:

与gets()的再一次邂逅(C/C++)

拜!

相关标签: C编程