#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);
При этом будет считываться только 1char
, а не имя. Используйте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;
}