我试图用来gets()
从用户那里获取一个字符串,但程序似乎正在传递gets()
。用户没有暂停输入。为什么gets()
什么都不做?
char name[13];
printf("Profile name: ");
gets(name);
printf("\n%s", name);
在调用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);
这是因为gets()
它使用起来非常危险,以至于一些 C 库已经完全删除了它,并用一个什么都不做的版本取而代之。
请改用fgets()。
使用 fflush(stdin); 在获取()之前
看看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);
你会遇到很多麻烦使用gets()
而是去 fgets()
fgets(name,13,stdin);
看到这个SO问题为什么gets函数如此危险以至于不应该使用它?
fgets()
不起作用的原因可能是您没有处理 scanf 在之前的语句中留下的换行符。
您可以修改您的 scanf 格式字符串以将其考虑在内:
scanf("%d *[^\n]", &N);
*[^\n]
表示忽略整数输入后不是换行符的所有内容,但不要对换行符执行任何操作(跳过它)。
当您使用时,scanf("%d",&num)
您点击 13 并且enter
存储13
在num
并且当您从中newline
读取字符时字符仍在输入缓冲区中,将视为您输入的数据并跳过该语句 fgets
stdin
\n
fgets()
您不能刷新输入缓冲区,但是您可以fseek(stdin,0,SEEK_END);
在每个 fgets 语句之前添加它
将以下函数添加到您的代码中并享受它。
string GetString()
{
char ch;
string Line="";
while(1)
{
ch=getchar();
if(ch=='\n')
break;
else
Line+=ch;
}
return Line;
}
此功能也可以影响所有空格和退格!!!