Gets()不起作用

我试图使用gets()从用户获取一个字符串,但程序似乎正在通过gets() 。 用户没有暂停输入。 为什么gets()没有做任何事情?

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

使用gets()遇到很多麻烦

而是去fgets()

 fgets(name,13,stdin); 

看到这个问题为什么获取function如此危险以至于不应该使用它?

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

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

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

当您使用scanf("%d",&num)您点击13并enter 13并存储在num ,当您从stdin读取fgets时, newline仍然在输入缓冲区中,它将\n视为您输入的数据和跳过fgets()语句

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

这是因为gets()起来非常危险,一些C库已经完全删除它并用一个什么都不做的版本替换它。

请改用fgets() 。

看看gets()参考

从stdin获取字符串

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

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

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

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

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

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

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

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

 string GetString() { char ch; string Line=""; while(1) { ch=getchar(); if(ch=='\n') break; else Line+=ch; } return Line; } 

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

在调用gets()或fgets()之前调用getchar()。 由于stdin中先前输入已经存在’\ n’而导致跳过了gets()或fgets(),因此调用getchar()会导致自己被跳过而不是gets()或fgets()或任何其他类似的函数。 但请记住它更多的是黑客而不是标准解决方案(我认为是这样),并且禁止使用gets()。

  printf("\nEnter a String: "); getchar(); //fgets(inputString, 100, stdin); gets(inputString); printf("\n%s", inputString);