忽略了在开关内的gets()

时间:2012-05-31 20:23:07

标签: c

有人可以告诉我为什么case 1中的获取被完全忽略了吗?

    // #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;

    }

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

scanf("%d", &choice);

被视为下一个gets(product);的输入,因此它读取一个空字符串。尝试在getchar之后添加人工scanf以吸收换行符:

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

现在应该工作。

答案 2 :(得分:1)

首先,重要的一点......

绝不永远不会使用gets。永远。即使是练习代码。即使别人告诉你。它就像电影 Highlander II ;它最好假装从未存在过。它已在C99中弃用,并已从C2011中完全删除。不要使用它。不要试图通过声称这只是练习代码来证明使用它。如果其他人要求您使用它,请回过头告诉他们您将使用fgets代替。如果他们给你带来悲伤,请把它们送给我,我会把它们整理出来。必要时用棒球棒。

好的,现在我已经清除了......

gets正在从您为之前的scanf来电输入的输入中获取尾随换行符。你有几个选择:

  1. 使用其他scanf来代替gets,这次使用%s转换说明符(以及字段宽度);与gets不同,它会跳过任何前导换行符;

  2. 在致电getchar()之前,请致电gets(或同等人)以使用换行符;

  3. 不使用choicescanf作为整数阅读,而是使用fgets将其作为文本阅读,并使用strtol将其转换为整数。

  4. 选项3是最好的IMO。将呼叫混合到scanf / fscanffgets通常是导致胃灼热的一个因素,正是由于后续的换行问题。最好坚持使用一切中的一个或另一个。使用fgets将所有内容作为文本读取的优点是它使输入验证更容易,尤其是对于数字输入。

答案 3 :(得分: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;

}

答案 4 :(得分:-1)

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

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

相关问题