C语言字符串gets(str)

#include<stdio.h>
int main(void)
{
char ch;
printf("Input a character: ");
scanf("%c",&ch);
printf("Input a string: ");
char str[80];
gets(str);
printf("%c\n",ch);
puts(str);
return 0;
}
期望输出是一个字符和一个字符串……但是为什么不!行!呢!!!
但如果颠倒一下先定义输入字符串后定义输入字符就可以……这是为!什!么!呢!!!
就这么个问题一晚上没整明白累不爱了……

在scanf("%c",&ch);之后加上getchar();

#include<stdio.h>

int main(void)

printf("Input a character: ");

scanf("%c",&ch);

fflush(stdin);//加上这句,清掉输入字符后,你再输入的回车符

printf("Input a string: ");

char str[80];

gets(str);

printf("%c\n",ch);

puts(str);

return 0;

}


字符串

因为本函数可以无限读取,易发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。

这个事实导致gets函数只适用于玩具程序,为了避免这种情况,可以用fgets(stdin) (fgets实际上可以读取标准输入,即大多数情况下的键盘输入),具体参阅fgets词条)来替换gets()。在V7的手册中说明:为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区。

以上内容参考:百度百科-gets

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-07

因为你输入一个字符后,又输入了一个回车键,这个回车键被存到了str这个字符数组中

所以出现了下面的输出:

加一句就行了,把标准输入文件缓存中的回车符去掉:

#include<stdio.h>
int main(void)
{
 char ch;
 printf("Input a character: ");
 scanf("%c",&ch);
 fflush(stdin);//加上这句,清掉输入字符后,你再输入的回车符
 printf("Input a string: ");
 char str[80];
 gets(str);
 printf("%c\n",ch);
 puts(str);
 return 0;

}

这样就正确了:

 

这个问题是比较典型的,

 

主要就是由于scanf函数的不安全性造成的。

第2个回答  推荐于2017-11-25
在 scanf("%c",&ch);之后加上getchar();

原因:因为你在输入的时候会敲回车,但是scanf遇到回车就停止输入,也就是说回车没有被输入,仍然停留在buffer中。于是,在遇到gets的时候,程序一开始就遇到回车,也就是字符串输入结束,从而str的内容为一个回车,这也是为什么输出会有一行空行的原因。加上getchar,程序会将残留的回车吃掉,于是gets的时候,buffer为空,让用户输入。

PS:这个问题在控制台有缓冲的时候会遇到(就是说只有敲回车,程序才会接受到输入),如果控制台没有缓存,则不会有这个问题。所以,如果你用cin.get同样会遇到这个问题,并不像@示申佥11说的是scanf的问题。本回答被提问者采纳
第3个回答  2013-05-07
在scanf("%c",&ch);后面加个getchar();用来抵消回车键('\n')的影响
第4个回答  2013-05-07
你需要理解STDIN,也就是输入缓存的概念。

当执行 scanf("%c", &ch); 时,你想想看,你都输入了什么?没错,一个字符,和一个回车('\n')。
scanf在当前输入缓存,找到了%c,写入ch后,将其从输入缓存移除,然后返回。

这时,输入缓存内还有一个字符,'\n'。

当你调用gets(str);后,发现输入缓存中还有内容,而且恰好由'\n'结束,于是,将"\n"这个字符串写入str,然后返回..

如果把连个过程反过来,
先调用 gets(str); 你输入内容.. 若干个字符,然后回车。(输入缓存中的内容自己想象哈)。gets把'\n'以及'\n'之前的所有字符,写入str,然后从输入缓存移除。这时输入缓存为空。

再调用scanf("%c", &ch),由于输入缓存为空,所以等待用户输入,用户输入一个字符,和一个回车,...

明白了吗?

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网