Как вводить несколько типов данных в c

Я пытаюсь написать программу, вычисляющую на основе ввода с клавиатуры, например, 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 и не распознает его

Вы читали о том, что scanf возвращает? Если вы ожидаете, что он извлечет три значения, вам также следует убедиться, что он возвращает 3. Если это не так, вы не получили от пользователя три значения.

Ted Lyngmo 29.03.2024 04:27
char c[1]; недостаточно велик, чтобы вместить строку из 1 символа и правильно завершить ее. Вам нужно как минимум 2 символа пробела. Если говорить о космосе, то это тоже персонаж. Измените printf на printf("%i %i '%c'",a,b,c); и посмотрите, что произойдет. Прочитав scanf(), вы оставляете символ новой строки в буфере и рассмотрите возможность изменения строки формата scanf на "%i%i %c".
Retired Ninja 29.03.2024 04:29
%s с char[1] позволяет ввести ровно ноль символов + нулевой терминатор. Если вы используете scanf для чтения массивов char, вычтите единицу из длины массива и ограничьте scanf: ​​Для char c[10] это будет scanf("%9s", c); — видите ошибку?
Ted Lyngmo 29.03.2024 04:30

Возможно, вас заинтересует sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html

Shawn 29.03.2024 04:39

Вам следует проверить значение, возвращаемое scanf(). Если это не 3, что-то пошло не так. Второй фрагмент кода будет работать, если вы наберете 2 3+, но вам нужно добавить пробел перед %c в формате scanf()"%i%i%c", чтобы он принял 2 3 +. Это потому, что %c — это один из трёх спецификаторов преобразования, который не пропускает пробелы (два других — это %[…] наборы сканирования и %n). (Точнее, когда вы вводите 2 3 + в формате "%i%i%c", пробел после 3 помещается в переменную c.) Не забудьте заканчивать сообщения printf() новой строкой.

Jonathan Leffler 29.03.2024 05:11

Ниже вы получили пару ответов. Пожалуйста, примите лучший вариант, нажав галочку рядом с ним, чтобы мы знали, что все готово.

Allan Wind 31.03.2024 09:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
93
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
  1. char c[2] необходим для хранения строки из одного символа с завершающим '\0'.

    Вы также можете использовать char c[1] или просто char c и прочитать один символ, не являющийся пробелом, с помощью %c (префикс пробела имеет значение). Когда вы печатаете символ, вам необходимо использовать спецификатор преобразования %c (вместо %s).

  2. Всегда используйте максимальную ширину поля при чтении строки с помощью scanf(), чтобы избежать переполнения буфера.

  3. Строка формата %s требует соответствия char *, которое вы пишете как c.

  4. В случае успеха scanf() вернуть количество успешно сопоставленных элементов. Если вы этого не проверите, возможно, вы работаете с неинициализированными переменными.

  5. (Не исправлено) Если вы введете только две цифры, 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+.

Другие вопросы по теме