Как использовать char в scanf с помощью цикла?

#c #char #scanf #billing

#c #char #scanf #выставление счетов

Вопрос:

Я хочу создать простое программное обеспечение для выставления счетов, но я не знаю, как решить эту проблему

 #include <stdio.h>
    
int main()
{
    char a[20];
    int i, j, b;
    i = 0;
    printf("How many item you have?n>>> ");
    scanf("%d", amp;j);
    for (int i = 0; i < j; i  )
    {
        
        printf("Type the name of item no. %d?n>>> ", i   1);
        scanf("%c", amp;a);
        printf("Type the item quantity?n>>> ");
        scanf("%d", amp;b);
    }
        
    return 0;
}
  

Как вы можете видеть, этот код предназначен только для того, чтобы задавать вопросы. В этом коде все в порядке, но когда я запускаю этот код, вывод:

 How many item you have?
>>> 4
Type the name of item no. 1?
>>> Type the item quantity?
>>>
  

Кажется, все в порядке, но я не ввел имя элемента, и цикл задает 2-й вопрос напрямую. Как это вообще возможно?

Комментарии:

1. Когда вы нажимаете Enter клавишу для количества элементов (ввода для j ), это добавляется во входной буфер в виде новой строки. Затем эта новая строка считывается следующим scanf вызовом для ввода a . Это очень распространенная проблема для начинающих, и если вы немного поищете, вы легко узнаете, как ее решить.

2. scanf("%c", amp;a); При этом будет считываться только 1 char , а не имя. Используйте s вместо этого. И, конечно, никогда не используйте scanf без проверки возвращаемого значения.

3. Читая источник немного больше, кажется, что вы хотите прочитать a строку , а не один символ. Опять же, это то, что вы должны были очень легко выяснить сами, так как любая приличная книга, учебник или класс должны были рассказать вам, как использовать scanf для чтения строк.

4. На другом, но не связанном примечании, пожалуйста, не используйте простые однобуквенные имена для ваших переменных. Используйте что-то, что описывает его использование, например, например name , вместо a . Это значительно облегчит чтение и понимание вашего кода.

Ответ №1:

Спецификатор %c формата для scanf чтения одного символа. Чтобы прочитать строку (массив) символов, используйте спецификатор %s формата. Кроме того, для таких массивов вам не нужен оператор amp; (address of), так как само имя массива будет «распадаться» на указатель на его первый элемент:

 #include <stdio.h>

int main()
{
    char a[20];
    int i, j, b;
    i = 0;
    printf("How many item you have?n>>> ");
    scanf("%d", amp;j);
    for (int i = 0; i < j; i  ) {
        printf("Type the name of item no. %d?n>>> ", i   1);
        scanf("s", a); // The "19" limits input size and allows space for the nul-terminator
        printf("Type the item quantity?n>>> ");
        scanf("%d", amp;b);
    }
    return 0;
}