程序按顺序忽略某些功能

时间:2014-04-23 00:42:43

标签: c arrays fgets

我已经创建了一个可变大小的数组(VLA),我想在fgets循环中使用for函数填充它。但是程序传递了一些函数,它奇怪地忽略了第一个fgets动作。

我的代码是;

void editorMain(void)
{
    printf("Please enter the number of items:  ");
    scanf("%u", &itemQuantity);
    printf("\n\n");

    char itemNames[itemQuantity][ITEM_NAME_LEN+1];

    memset(&itemNames, 0, sizeof(itemNames));

    printf("Please enter the names of items:  \n");

    char line[ITEM_NAME_LEN+1];

    memset(&line, 0, sizeof(line));

    for (int i = 0; i < itemQuantity; ++i) {
        printf("#%d:  ", i + 1);

        memset(&line, 0, sizeof(line));

        fgets(line, ITEM_NAME_LEN+1, stdin);

        for (int a = ITEM_NAME_LEN+1; a >= 0; --a) {
            if (line[a] == '\n') {
                line[a] = 0;
            }

            else;
        }

        snprintf(itemNames[i], ITEM_NAME_LEN+1, "%s", line);
    }
...
}

它输出;

Please make a choice:  2

Please enter the number of items:  4


Please enter the names of items:  
#1:  #2:  Marlboro
#3:  Parliament
#4:  Winston

Please enter the prices of items:  
#1:  25
#2:  950
#3:  1000
#4:  800
  ................... AVAILABLE ITEMS oo

         #           Item Name          Price
         =           =========        =======

         1.                           0.25 TL
         2.           Marlboro        9.50 TL
         3.         Parliament       10.00 TL
         4.            Winston        8.00 TL

  Enter your item selection:  

你的建议是什么?

1 个答案:

答案 0 :(得分:1)

scanf("%u"调用会读取换行符,但会将该字符留在输入流中。当你打电话给你的第一个fgets时,它只是读取换行符并给你一个空字符串。

有许多方法可以清除输入流,在这种情况下,您只需在fgets之后向scanf添加虚拟来电。