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);