1

我试图用来gets()从用户那里获取一个字符串,但程序似乎正在传递gets()。用户没有暂停输入。为什么gets()什么都不做?

char name[13];
printf("Profile name: ");
gets(name);
printf("\n%s", name);
4

6 回答 6

6

在调用gets() 或fgets() 之前调用getchar()。由于从标准输入中的先前输入中已经存在'\n',gets() 或 fgets() 将被跳过,调用 getchar() 将导致自身被跳过,而不是 gets() 或 fgets() 或任何其他类似函数. 但请记住,它更像是一种 hack 而不是标准解决方案(我认为是这样),并且还禁止使用 gets()。

        printf("\nEnter a String: ");
        getchar();
        //fgets(inputString, 100, stdin);
        gets(inputString);
        printf("\n%s", inputString);
于 2017-03-25T13:51:59.077 回答
3

这是因为gets()它使用起来非常危险,以至于一些 C 库已经完全删除了它,并用一个什么都不做的版本取而代之。

请改用fgets()

于 2013-10-30T18:32:05.223 回答
3

使用 fflush(stdin); 在获取()之前

于 2019-04-10T18:29:19.973 回答
1

看看gets()参考

从标准输入获取字符串

从标准输入 (stdin) 读取字符并将它们作为 C 字符串存储到 str 中,直到到达换行符或文件结尾。

如果找到换行符,则不会将其复制到 str 中。

在复制到 str 的字符之后会自动附加一个终止空字符。

请注意,gets 与 fgets 完全不同:gets 不仅使用标准输入作为源,而且在结果字符串中不包括结束换行符,并且不允许为 str 指定最大大小(这可能导致缓冲区溢出)。

因此,基本上gets()不仅不安全(可能导致缓冲区溢出),而且还读取输入缓冲区中的内容。

我建议您使用fgets(),但如果您想要一个快速(懒惰和愚蠢)的解决方案,只需刷新输入缓冲区:

char name[13];
printf("Profile name: ");
fflush(stdin);
gets(name);
printf("\n%s", name);
于 2013-10-30T18:33:47.990 回答
1

你会遇到很多麻烦使用gets()

而是去 fgets()

fgets(name,13,stdin);  

看到这个SO问题为什么gets函数如此危险以至于不应该使用它?

fgets()不起作用的原因可能是您没有处理 scanf 在之前的语句中留下的换行符。

您可以修改您的 scanf 格式字符串以将其考虑在内: scanf("%d *[^\n]", &N);

*[^\n]表示忽略整数输入后不是换行符的所有内容,但不要对换行符执行任何操作(跳过它)。

当您使用时,scanf("%d",&num)您点击 13 并且enter存储13num并且当您从中newline读取字符时字符仍在输入缓冲区中,将视为您输入的数据并跳过该语句 fgetsstdin\nfgets()

您不能刷新输入缓冲区,但是您可以fseek(stdin,0,SEEK_END);在每个 fgets 语句之前添加它

于 2013-10-30T18:34:41.910 回答
1

将以下函数添加到您的代码中并享受它。

string GetString()
{
   char ch;
   string Line="";

   while(1)
   {
       ch=getchar();

       if(ch=='\n')
          break;
       else
          Line+=ch;
    }

    return Line;
}

此功能也可以影响所有空格和退格!!!

于 2017-04-11T07:22:36.090 回答