【问题标题】:User input getting skipped用户输入被跳过
【发布时间】:2021-07-05 17:37:19
【问题描述】:

我想获取结构的三个不同变量的输入,但每次都会跳过一个或另一个用户输入。我是编程新手,不知道发生了什么。请帮助我理解这里的问题。 我试图寻找解决此问题的方法,但我自己无法弄清楚。

#include <stdio.h>
#include <string.h>

struct details
{
    char name[50];
    char license[30];
    char route[120];
    int km;
} driver1, driver2, driver3;

int main()
{
    printf("Driver 1\n");
    printf("Name: ");
    scanf("%s", &driver1.name);
    printf("License Number: ");
    scanf("%s", &driver1.license);
    printf("Route: ");
    scanf("%s", &driver1.route);
    printf("Approx km driven: ");
    scanf("%d", &driver1.km);
    printf("\n");

    printf("Driver 2\n");
    printf("Name: ");
    scanf("%s", &driver2.name);
    printf("License Number: ");
    scanf("%s", &driver2.license);
    printf("Route: ");
    scanf("%s", &driver2.route);
    printf("Approx km driven: ");
    scanf("%d", &driver2.km);
    printf("\n");

    printf("Driver 3\n");
    printf("Name: ");
    scanf("%s", &driver3.name);
    printf("License Number: ");
    scanf("%s", &driver3.license);
    printf("Route: ");
    scanf("%s", &driver3.route);
    printf("Approx km driven: ");
    scanf("%d", &driver3.km);
    printf("\n");

    printf("Driver 1 details:\n");
    printf(" Name: %s\n", driver1.name);
    printf(" License number: %s\n", driver1.license);
    printf(" Route: %s\n", driver1.route);
    printf(" Apprrox km driven: %d", driver1.km);
    printf("\n");

    printf("Driver 2 details:\n");
    printf(" Name: %s\n", driver2.name);
    printf(" License number: %s\n", driver2.license);
    printf(" Route: %s\n", driver2.route);
    printf(" Apprrox km driven: %d", driver2.km);
    printf("\n");

    printf("Driver 3 details:\n");
    printf(" Name: %s\n", driver3.name);
    printf(" License number: %s\n", driver3.license);
    printf(" Route: %s\n", driver3.route);
    printf(" Apprrox km driven: %d", driver3.km);
    printf("\n");

    return 0;
}

【问题讨论】:

  • 你能发布一个显示问题的会话的输入和输出吗?你输入的公里数是整数吗?
  • "%s" 在第一个空白字符处停止,因此如果“名称”作为名字和姓氏给出,则只有名字将存储在 driver.name 中,姓氏将是存储在driver.license。换句话说,你应该edit这个问题并向我们展示给程序的输入,以及从程序接收到的输出。

标签: c scanf


【解决方案1】:

scanf("%s", &amp;driver1.name);

我通常推荐fgets 而不是scanf%s,但在这种情况下,麻烦大于它的价值,所以我给你这个辅助函数:

int fgetstring(FILE *f, char *string, size_t n)
{
    int offset = 0;
    int c;
    while ((c = fgetc(f)) != EOF && c != '\n') {
         if (offset + 1 < n)
             string[offset++] = (char)c;
    }
    string[offset] = 0;
    return (c != EOF);
}

这个辅助函数只是将一行读入一个字符串。像这样调用:

fgetstring(stdin, driver1.name, 50);

我预计您在 %d 之后可能会遇到缓冲区中剩余空白的问题。你可以通过几种方式吃它,最简单的是:

#include <limits.h>
int eatwhitespace(FILE *f)
{
    int c;
    while ((c = fgetc(f)) != EOF && isspace(c))
        ;
    if (c != EOF) { ungetc(c, f); return 1; }
    return 0;
}

【讨论】:

  • int offset 不如size_t offset。与其用幻数 50 打电话,不如考虑fgetstring(stdin, driver1.name, sizeof driver1.name);
猜你喜欢
  • 2021-11-29
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多