无法输入" gets()"

时间:2016-05-17 00:55:08

标签: c

我写了一个c程序,提示用户将他们的帐户信息输入系统,然后打印出来。我尝试使用" gets()"捕获字符串。但是,它跳过了用户地址的问题,并跳进了州和城市的问题。我相信问题是" gets()"功能。有人可以帮帮我吗?

#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 40
struct account
{
    long unsigned number;
    char address[MAXLEN];
    char cityState[MAXLEN];
    int zip;
    double balances;
    double credit;
    char name[MAXLEN];
};

int main(void)
{
    struct account memebr;
    puts("Please enter the account number");
    scanf("%lu", &memebr.number);
    puts("Please enter the street address");
    while(getchar() != '\n')
        gets(memebr.address);
    puts("Please enter your city/state");
    while(getchar() != '\n')
        gets(memebr.cityState);
    puts("Please enter your zip code");
    scanf("%d", &memebr.zip);
    puts("Please enter your balances");
    scanf("%lf", &memebr.balances);
    puts("Please enter your credit limit");
    scanf("%lf", &memebr.credit);
    puts("Please enter your name");
    while(getchar() != '\n')
        gets(memebr.name);

    printf("Account number: %lu\n", memebr.number);
    printf("The street address is : %s\n", memebr.address);
    printf("The owner comes from: %s\n", memebr.cityState);
    printf("The zip code is: %d\n", memebr.zip);
    printf("The owner's balances: %.2f\n", memebr.balances);
    printf("The owner's credit limit: %.2f\n", memebr.credit);
    printf("The owener is: %s\n", memebr.name);
    return 0;

}

2 个答案:

答案 0 :(得分:1)

您要求输入两次,getchar()仅在刷新缓冲区时返回,即按下 Enter 1 时。因此,getchar()调用会消耗所有内容,然后您必须再次为gets()键入相同的内容。

试试这个

fgets(member.name, sizeof(member.name), stdin);

而不是

while (getchar() != '\n')
    gets(member.name);

请注意,我将gets()替换为fgets(),这更安全,仍然是标准的一部分。

1 实际上,当'\n'插入缓冲区时。

答案 1 :(得分:0)

参考上一个问题&#34; getchar does not stop when using scanf&#34;,输入仅在您输入换行符后发送到程序,但files/default将换行符留在输入缓冲区中。然后以下scanf("%s", command );将立即返回换行符。这就是程序不等待进一步输入的原因。

因此,在读取后续输入之前,需要确保清理std输入缓冲区。修改你的代码:

getchar()

scanf("%lu", &memebr.number);
puts("Please enter the street address");
while(getchar() != '\n')
    gets(memebr.address);

应该可以执行该程序。