关于C语言里的gets()问题,为什么名字输入被跳过?

请问那个gets()是哪里没用对吗?... 请问那个gets()是哪里没用对吗? 展开
 我来答
kaixingui2012
推荐于2018-02-27 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6391万
展开全部
  • C语言里的gets()函数功能是从输入缓存中读取多个字符,遇到回车符时,结束输入。

  • 当使用gets()函数之前有过数据输入,并且,操作者输入了回车确认,这个回车符没有被清理,被保存在输入缓存中时,gets()会读到这个字符,结束读字符操作。因此,从用户表面上看,gets()没有起作用,跳过了。

  • 解决办法:

    • 方法一、在gets()前加fflush(stdin); //强行清除缓存中的数据(windows下可行)

    • 方法二、根据程序代码,确定前面是否有输入语句,如果有,则增加一个getchar()命令,然后再调用 gets()命令。

    • 方法三、检查输入结果,如果得到的字符串是空串,则继续读入,如:

      • char str[100]={0};

      • do {

      •     gets(str);

      • } while( !str[0] );

淡若亲风
2015-09-20 · TA获得超过409个赞
知道小有建树答主
回答量:204
采纳率:0%
帮助的人:149万
展开全部
gets函数可能把stdin缓冲区里面的内容读到数组里面,所以会被跳过
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
huliyuputao
2014-01-07 · TA获得超过1912个赞
知道小有建树答主
回答量:728
采纳率:0%
帮助的人:226万
展开全部

#include <stdio.h>

char *gets(char *s);

Description

The gets function reads characters from the input stream pointed to by stdin,into the

array pointed to by s,until end-of-&#64257;le is encountered or a new-line character is read.

Anynew-line character is discarded, and a null character is written immediately after the

last character read into the array.

Returns

The gets function returns s if successful. If end-of-&#64257;le is encountered and no

characters have been read into the array,the contents of the array remain unchanged and a

null pointer is returned. If a read error occurs during the operation, the array contents are

indeterminate and a null pointer is returned.


以上是 C9899 的标准, 所以你的问题是输入的缓冲区中的回车符号造成的

解决的方法是: 

#include <stdio.h>
int main()
{
char name[20];
int m;
scanf("%d" , &m);    // 输入之后数字被赋值, 但是有回车符还留在输入缓冲区
fflush(stdin);    // 清除输入缓冲区, 或者用 getchar(); 但是是下策
printf("%d\n", m);
gets(name);
printf("%s", name);
return 0;
}
追问
但是为什么接收文件那里不加getchar()也可以呢?谢谢!
scanf()不能接受回车吗?好像可以的吧?
追答

因为你后面的输入是数字, 所以不符合输入的条件, 所以被系统丢掉了, 最好的是在使用scanf (原型 int scanf(const char * restrict format, ...)) 函数的后面都加上 fflush(stdin)(原型int fflush(FILE *stream))


或者你使用下面的输入格式

#include <stdio.h>
int main()
{
    char name[20];
    int m;
    scanf("%d\n" , &m);    // 格式化输入后面加上\n
    printf("%d\n", m);
    gets(name);
    printf("%s", name);
    return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
share_fun1
推荐于2017-12-15 · TA获得超过610个赞
知道小有建树答主
回答量:298
采纳率:0%
帮助的人:366万
展开全部
在for循环之前加一个getchar();就应该可以解决你的问题
更多追问追答
追问

但是为什么接收文件那里不加getchar()也可以呢?谢谢!

追答
主要问题是scanf("%d",);的和gets函数混用,导致gets之前缓冲区里面有一个没有清除掉字符(回车),因此gets那句相当于直接回车掉了

谢谢采纳
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式