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 的内容保持不变,并返回一个空指针。如果发生错误,返回一个空指针。
- 在读字符时遇到end-of-file,则eof指示器被设置,如果还没读入任何字符就遇到这种情况,则stream保持原来的内容,返回NULL;
- 如果发生读入错误,error指示器被设置,返回NULL,stream的值可能被改变。
使用方法:
char str[10];
while (fgets(str, 10, stdin) != NULL)
以上是关于C语言字符串gets(str)的主要内容,如果未能解决你的问题,请参考以下文章