我对C很新,我在向程序输入数据时遇到了问题。
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
int a;
char b[20];
printf("Input your ID: ");
scanf("%d", &a);
printf("Input your name: ");
gets(b);
printf("---------");
printf("Name: %s", b);
system("pause");
return 0;
}
它允许输入ID,但它只是跳过其余的输入。如果我改变这样的顺序:
printf("Input your name: ");
gets(b);
printf("Input your ID: ");
scanf("%d", &a);
它会起作用。虽然,我不能改变秩序,我需要它原样。有人能帮我吗 ?也许我需要使用其他一些功能。谢谢!
答案 0 :(得分:12)
尝试:
scanf("%d\n", &a);
只读取scanf离开的'\ n'。另外,你应该使用fgets not gets:http://www.cplusplus.com/reference/clibrary/cstdio/fgets/来避免可能的缓冲区溢出。
修改强>
如果上述方法不起作用,请尝试:
...
scanf("%d", &a);
getc(stdin);
...
答案 1 :(得分:7)
scanf
不消耗换行符,因此是fgets
的天敌。没有好的黑客,不要把它们放在一起。这两个选项都有效:
// Option 1 - eat the newline
scanf("%d", &a);
getchar(); // reads the newline character
// Option 2 - use fgets, then scan what was read
char tmp[50];
fgets(tmp, 50, stdin);
sscanf(tmp, "%d", &a);
// note that you might have read too many characters at this point and
// must interprete them, too
答案 2 :(得分:2)
scanf不会消耗\ n因此它将被scanf后面的gets所占用。像scanf这样在scanf之后刷新输入流。
#include <stdlib.h>
#include <string.h>
int main(void) {
int a;
char b[20];
printf("Input your ID: ");
scanf("%d", &a);
fflush(stdin);
printf("Input your name: ");
gets(b);
printf("---------");
printf("Name: %s", b);
system("pause");
return 0;
}
答案 3 :(得分:1)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
int a;
char b[20];
printf("Input your ID: ");
scanf("%d", &a);
getchar();
printf("Input your name: ");
gets(b);
printf("---------");
printf("Name: %s", b);
return 0;
}
Note:
If you use the scanf first and the fgets second, it will give problem only. It will not read the second character for the gets function.
If you press enter, after give the input for scanf, that enter character will be consider as a input f or fgets.
答案 4 :(得分:0)
你应该这样做。
fgetc(stdin);
scanf("%c",&c);
if(c!='y')
{
break;
}
fgetc(stdin);
通过读取来读取scanf的输入。
答案 5 :(得分:0)
只需使用2个gets()函数
当你想在scanf()之后使用gets()时,你要确保使用2个gets()函数,并且在上面的例子中写下你的代码:
int main(void) {
int a;
char b[20];
printf("Input your ID: ");
scanf("%d", &a);
//the change is here*********************
printf("Input your name: ");
gets(b);
gets(b);
//the change is here*********************
printf("---------");
printf("Name: %s", b);
system("pause");
return 0;
}
解释(isaaconline96@gmail.com);
答案 6 :(得分:0)
.Select
无法读取返回值,因为scanf("%d", &a);
只接受十进制整数。因此,您可以在下一个%d
的开头添加\n
,以忽略缓冲区中的最后一个scanf
。
然后,\n
现在可以毫无问题地读取字符串,但scanf("\n%s", b);
在找到空格时停止读取。因此,请将scanf
更改为%s
。这意味着:“阅读everthing但%[^\n]
”
\n
scanf("\n%[^\n]", b);
答案 7 :(得分:0)
scanf
函数在尝试解析字符以外的内容之前会自动删除空格。 %c
,%n
,%[]
是不会删除前导空格的例外情况。
gets
正在阅读上一个{{1}留下的换行符}。使用scanf
getchar();