0

有人可以告诉我为什么case 1完全忽略了 get 吗?

    // #define M 50 is at the top

    char product[M] = {0};
    int choice = -1;

    printf("Command: ");
    scanf("%d", &choice);

    switch(choice){

        case 0:
            break;

        case 1:
            printf("Product: ");
            gets(product);
            insert_product(warehouse, price, product);
            break;

        case 2:
            // print_all();
            break;

        default:
            printf("Scelta non valida\n");
            break;

    }
4

5 回答 5

5

获取可能会被先前输入的结束字符跳过。尝试在获取之前添加一个 getchar() 以查看是否是问题所在。

于 2012-05-31T20:31:26.017 回答
1

问题是您在阅读时输入的换行符choice

scanf("%d", &choice);

被用作下一个的输入gets(product);,因此它读取一个空字符串。尝试添加一个人工getcharscanf吸收换行符:

scanf("%d", &choice);
getchar();

现在应该可以工作了。

于 2012-05-31T20:35:09.493 回答
1

首先,重要的一点...

永远不要永远不要使用gets. 曾经。即使是练习代码。即使别人告诉你。就像电影Highlander II;最好假装它从未存在过。它在 C99 中已弃用,并已从 C2011 中完全删除。不要使用它。不要试图通过声称这只是练习代码来证明使用它的合理性。如果其他人要求您使用它,请退后并告诉他们您将使用它fgets。如果他们让你伤心,把它们寄给我,我会纠正它们。必要时使用棒球棒。

好吧,既然我已经清除了...

getsscanf正在从您为上一个呼叫输入的输入中提取尾随换行符。你有几个选择:

  1. 使用另一个scanf调用而不是gets,这次使用%s转换说明符(以及字段宽度);不像gets,它会跳过任何前导换行符;

  2. 在调用之前调用getchar()(或等效)以使用换行符gets

  3. 与其使用 读取choice为整数scanf,不如使用 将其读取为文本fgets并使用 将其转换为整数strtol

选项 3 是最好的 IMO。混合调用scanf/fscanf并且fgets通常是胃灼热的原因,正是因为尾随的换行问题。最好在所有事情上都坚持使用其中一种。使用fgets以文本形式读取所有内容的优点是它使输入验证更容易,尤其是对于数字输入。

于 2012-05-31T21:00:24.297 回答
0

// #define M 50 在顶部

char product[M] = {0};
int choice = -1;

printf("Command: ");
scanf("%d", &choice);

switch(choice){

    case 0:
        break;

    case 1:
        printf("Product: ");
        getchar();
        gets(product);
        insert_product(warehouse, price, product);
        break;

    case 2:
        // print_all();
        break;

    default:
        printf("Scelta non valida\n");
        break;

}
于 2016-03-17T10:25:04.120 回答
-1

在使用fflush(stdin)之前使用gets作为输入,因为在gets使用之后将换行符作为输入scanf("%d", &choice);

fflush(stdin)清除输出缓冲区并将缓冲的数据移动到控制台。

于 2018-11-17T19:18:49.413 回答