scanf被跳过(?)

时间:2016-11-03 02:47:41

标签: c

我尝试做一个小型的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;
}

我非常感谢您提供的任何帮助!

3 个答案:

答案 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