我试图使用gets()
从用户获取一个字符串,但程序似乎直接跳过了gets()
。没有暂停等待用户输入。为什么gets()
没有起作用?
char name[13];
printf("Profile name: ");
gets(name);
printf("\n%s", name);
printf("\nEnter a String: ");
getchar();
//fgets(inputString, 100, stdin);
gets(inputString);
printf("\n%s", inputString);
之所以gets()
如此危险,以至于一些C库已经将其完全删除,并用一个什么也不做的版本替换了它。
请使用fgets()代替。
gets()
会遇到很多麻烦,建议使用fgets()
代替。fgets(name,13,stdin);
scanf("%d *[^\n]", &N);
*[^\n] 表示忽略整数输入后面不是换行符的所有内容,但是不要对换行符做任何处理(跳过它)。scanf("%d",&num)
时,您会输入数字 13 和回车,然后 13 存储在 num 中,而换行符仍然存在于输入缓冲区中。当您从 stdin 中读取 fgets 时,它会将 \n 视为您输入的数据,因此跳过了 fgets() 语句。fseek(stdin,0,SEEK_END);
来实现此操作。fgets(name, sizeof(name), stdin)
。 - chux - Reinstate Monicagets()
参考文献
从标准输入中获取字符串
从标准输入(stdin)读取字符,并将它们作为C字符串存储到str中,直到遇到换行符或文件结束符为止。gets()
不仅不安全(可能导致缓冲区溢出),而且读取了输入缓冲区中的内容。fgets()
,但如果您想要快速(和懒惰和愚蠢)解决方案,请清除输入缓冲区。char name[13];
printf("Profile name: ");
fflush(stdin);
gets(name);
printf("\n%s", name);
fflush(stdin)
是未定义的行为。 - digital_revenantstring GetString()
{
char ch;
string Line="";
while(1)
{
ch=getchar();
if(ch=='\n')
break;
else
Line+=ch;
}
return Line;
}
这个功能会影响所有的空格和退格符号!!!
int c; while((c=getchar()) != '\n' && c != EOF);
这会丢弃当前行的其余部分(可能已经被scanf()
等部分读取),并继续到下一行。
虽然fflush(stdin)
也可以丢弃输入,但这是非标准行为,不建议使用。
您永远不应该使用gets(myString)
,因为它已经完全从C标准中删除,由于其不安全性。它不强制执行字符串的长度,因此您可以超过缓冲区的末尾并覆盖RAM中的其他值,导致缓冲区溢出,这可能是安全漏洞。请改用fgets(myString, myStringSize, stdin)
。要消除结果字符串中的换行符,请使用myString[strcspn(myString, "\n")] = 0;
。
'\0'
。 - Kevinfgets(name, sizeof name, stdin)
代替gets()
,这个问题已经被回答了很多次,请查看其中一个答案:http://stackoverflow.com/questions/7231349/getsstring-function-skipping-first-gets-request?rq=1 - Gangadharscanf
读取字符串。请使用fgets
。 - Kninnugscanf
格式的末尾留下一个空格,以便它消耗输入中的任何空格(例如尾随换行符)。但请不要引用我说的话。 - Kninnug