Я пытаюсь написать программу, вычисляющую на основе ввода с клавиатуры, например, b c, a — это номер 1, b — это номер 2, а c — оператор, но она не позволяет мне назначать b, когда я использую строку, она не показывает c, когда Я использую char, может кто-нибудь объяснить, как это работает, и как я могу вводить несколько типов данных. Я новичок в C, и я пробовал C++, прежде чем их будет легче вводить.
#include <stdio.h>
int main() {
int a , b;
char c[1];
scanf("%i%i%s", &a, &b, &c); //type 2 3 +
printf("%i %i %s",a,b,c);
}
выход 2 0 +
и когда я попытался использовать char #include <stdio.h>
int main() {
int a , b;
char c;
scanf("%i%i%c", &a, &b, &c);
printf("%i %i %c",a,b,c);
}
вывод равен 2 3, он не показывает c и не распознает его
char c[1]; недостаточно велик, чтобы вместить строку из 1 символа и правильно завершить ее. Вам нужно как минимум 2 символа пробела. Если говорить о космосе, то это тоже персонаж. Измените printf на printf("%i %i '%c'",a,b,c); и посмотрите, что произойдет. Прочитав scanf(), вы оставляете символ новой строки в буфере и рассмотрите возможность изменения строки формата scanf на "%i%i %c".
%s с char[1] позволяет ввести ровно ноль символов + нулевой терминатор. Если вы используете scanf для чтения массивов char, вычтите единицу из длины массива и ограничьте scanf: Для char c[10] это будет scanf("%9s", c); — видите ошибку?
Возможно, вас заинтересует sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html
Вам следует проверить значение, возвращаемое scanf(). Если это не 3, что-то пошло не так. Второй фрагмент кода будет работать, если вы наберете 2 3+, но вам нужно добавить пробел перед %c в формате scanf()"%i%i%c", чтобы он принял 2 3 +. Это потому, что %c — это один из трёх спецификаторов преобразования, который не пропускает пробелы (два других — это %[…] наборы сканирования и %n). (Точнее, когда вы вводите 2 3 + в формате "%i%i%c", пробел после 3 помещается в переменную c.) Не забудьте заканчивать сообщения printf() новой строкой.
Ниже вы получили пару ответов. Пожалуйста, примите лучший вариант, нажав галочку рядом с ним, чтобы мы знали, что все готово.





char c[2] необходим для хранения строки из одного символа с завершающим '\0'.
Вы также можете использовать char c[1] или просто char c и прочитать один символ, не являющийся пробелом, с помощью %c (префикс пробела имеет значение). Когда вы печатаете символ, вам необходимо использовать спецификатор преобразования %c (вместо %s).
Всегда используйте максимальную ширину поля при чтении строки с помощью scanf(), чтобы избежать переполнения буфера.
Строка формата %s требует соответствия char *, которое вы пишете как c.
В случае успеха scanf() вернуть количество успешно сопоставленных элементов. Если вы этого не проверите, возможно, вы работаете с неинициализированными переменными.
(Не исправлено) Если вы введете только две цифры, scanf() будет ждать оператора. Если вы не хотите такого поведения, используйте fgets() или getline(), чтобы получить строку ввода. Затем обработайте это с помощью sscanf() или функций более низкого уровня, таких как strtol(). Это гарантирует, что вы добьетесь прогресса, выбрав то, что вам нужно, и отбросив все остальное. Разделение обработки ввода-вывода (проверка EOF) и синтаксического анализа также приводит к упрощению кода.
#include <stdio.h>
int main(void) {
int a;
int b;
char c[2];
if (scanf("%i%i%1s", &a, &b, c) != 3) {
printf("scanf failed\n");
return 1;
};
printf("%i %i %s\n", a, b, c);
}
Пример запуска:
$ ./a.out
1 x
scanf failed
$ ./a.out
1 2 +
1 2 +
Проблема 1. Если вы объявляете строку, в конце у нее есть '\0', поэтому вам нужно увеличить длину массива, например c[2]. Так что это будет
[0] [1]
+ '\0'
Проблема 2: при вводе 2 3 + после c будет стоять пробел, поэтому вам нужно ввести 3, чтобы получить 2 3+.
Вы читали о том, что
scanfвозвращает? Если вы ожидаете, что он извлечет три значения, вам также следует убедиться, что он возвращает3. Если это не так, вы не получили от пользователя три значения.