C语言字符串gets(str)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

参考技术A

因为你输入一个字符后,又输入了一个回车键,这个回车键被存到了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函数的不安全性造成的。

参考技术B 在 scanf("%c",&ch);之后加上getchar();

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

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

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

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

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

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

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

明白了吗?

ACM中gets函数用不了

因为这个函数不安全,现代c++编译器里面都删除了这个函数,网络上的gets_s有在VS中才能使用。推荐使用fgets

函数原型

char *fgets(char *str, int n, FILE *stream);

参数

  • str– 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
  • n– 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
  • stream– 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。

功能

从指定的流 stream 读取一行,并把它存储在str所指向的字符串内。当读取**(n-1)**个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。

返回值

如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。如果发生错误,返回一个空指针。

  1. 在读字符时遇到end-of-file,则eof指示器被设置,如果还没读入任何字符就遇到这种情况,则stream保持原来的内容,返回NULL;
  2. 如果发生读入错误,error指示器被设置,返回NULL,stream的值可能被改变。

使用方法:

char str[10];
while (fgets(str, 10, stdin) != NULL)

    

以上是关于C语言字符串gets(str)的主要内容,如果未能解决你的问题,请参考以下文章

C语言用如何用scanf输入带有空格的字符串

C语言如何用GETS输入2维数组

用数组编写C语言程序

C语言中怎么判断一个字符串包含在另一个字符串里面?

c语言编程中字符串复制函数编程程序出现错误,这是怎么回事?

c语言中如何输入输出字符串