我尝试做一个小型的Worker Register,但它完全跳过了第二个scanf,它获得了地址值。我是初学者,所以我不知道我做错了什么。这是代码:
#include <stdio.h>
int main()
{
// var
char n[256], ad[256]; // n - Name, ad - Address
int i, ag; // i - Income, ag - Age
// code
printf("Welcome to the Worker Register\n\nWorker Data\n\nName: ");
scanf("%255[^\n]", n);
printf("Address: ");
scanf("%255[^\n]", ad);
printf("Age: ");
scanf("%d", &ag);
printf("Income: R$");
scanf("%d", &i);
printf("Worker %s\nAddress: %s\nAge: %d\nIncome: R$%d", n, ad, ag, i);
return 0;
}
我非常感谢您提供的任何帮助!
答案 0 :(得分:1)
只需添加一个getchar();说实话,我不知道为什么,但这在我学校很多次发生在我身上。它似乎解决了它:)
代码:
#include <stdio.h>
int main()
{
// var
char n[256], ad[256]; // n - Name, ad - Address
int i, ag; // i - Income, ag - Age
// code
printf("Welcome to the Worker Register\n\nWorker Data\n\nName: ");
scanf("%255[^\n]", n);
printf("Address: ");
getchar();
scanf("%255[^\n]", ad);
printf("Age: ");
scanf("%d", &ag);
printf("Income: R$");
scanf("%d", &i);
printf("Worker %s\nAddress: %s\nAge: %d\nIncome: R$%d", n, ad, ag, i);
return 0;
}
答案 1 :(得分:1)
Nad的添加getchar()的黑客似乎解决了它,但如果我是你,我不会使用scanf来读取字符串。
使用fgets()读取字符串会更好。字符串上的scanf是有问题的。请参阅:Reading a string with scanf
e.g。
#include <stdlib.h>
...
printf("Welcome to the Worker Register\n\nWorker Data\n\nName: ");
fgets(n, 256, stdin);
...
关于fgets()
中的尺寸参数。手册页指出:
fgets()从流中读取最多一个小于大小的字符 和 将它们存储到s指向的缓冲区中。读后停止了 EOF或换行符。如果读取换行符,则将其存储到缓冲区中。 终止空字节('\ 0')存储在最后一个字符之后 缓冲区。
因此,您输入缓冲区的大小并忽略空字节,因为fgets将为您工作。
答案 2 :(得分:0)
"%255[^\n]"
表示输入到换行符(接受换行符以外的输入)。(不包括换行符。)
因此,输入缓冲区(stdin)中有一个换行符,
second scanf(scanf("%255[^\n]", ad);
)也接受换行符以外的输入,
所以,它不会被输入。
因此,您需要在第一次扫描中使用换行符。
E.g scanf("%255[^\n]%*c", n);
%*c
忽略一个字符(即换行符)。
由于第3次扫描的%d
会跳过前面的空格,因此第二次扫描不需要%*c
。