Прочитайте один пользовательский ввод с помощью scanf и преобразуйте его в соответствующий тип данных

У меня есть программа, которая читает пользовательский ввод как таковой:

char c;
scanf("%c", &c);

а затем проверяет, является ли это цифрой:

if (isdigit(c)) {
    int f = atoi(c);
    return f;
}

switch(c) {
    case 'q':
        exit(1);
        break;
    ...
}
...

Пример программы:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main() {
    char c;
    scanf("%c", &c);

    if (isdigit(c)) {
        int f = atoi(&c);
        printf("f: %d\n", f);
        return f;
    }

    switch(c) {
        case 'q':
            printf("q\n");
            return -1;
            break;
    }

    return 0;
}

Однако, когда я ввожу, например, 10, ввод становится 1, 0 и \n. Я хочу 10. Как мне прочитать, например, «10», «100» и «4», а также другие символы, такие как «q»?

Вы можете прочитать строку

ForceBru 09.12.2020 16:25

Помните, что аргументом atoi является строка с нулем в конце. У него также нет никакой проверки. Используйте, например. strtol для функции преобразования с проверкой.

Some programmer dude 09.12.2020 16:25

@ForceBru, если я прочитаю строку, то как мне преобразовать ее в число с плавающей запятой и использовать оператор switch?

pointersarehard 09.12.2020 16:30

@Someprogrammerdude спасибо за напоминание. Я только начинаю изучать C, и я знаю падение scanf и atoi и т. д. Это только для начала. Еще раз спасибо!

pointersarehard 09.12.2020 16:31

@pointersarehard, вы можете использовать strcmp вместо оператора switch

ForceBru 09.12.2020 16:32

@ForceBru использует scanf для строки: char string[200]; приводит к format specifies type 'char *' but the argument has type 'char (*)[256]' [-Wformat]

pointersarehard 09.12.2020 16:32

@pointersarehard, попробуйте прочитать &string[0] вместо string.

ForceBru 09.12.2020 16:34

Используйте обычный string, а не &string. Или &string[0] (это то, во что превратится простое string).

Some programmer dude 09.12.2020 16:36

Теперь я не могу использовать «isdigit», потому что он не может принимать массив символов: warning: incompatible pointer to integer conversion passing 'char [10]' to parameter of type 'int'

pointersarehard 09.12.2020 16:42

Сначала прочитайте свою строку. Затем проверьте, не является ли это командой «quit». Затем попробуйте преобразовать его в целое число. И если преобразование прошло успешно (и вся строка была преобразована), используйте целочисленное значение.

Some programmer dude 09.12.2020 16:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
10
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

переменные char могут сохранять только один символ. Поэтому, если вы хотите иметь несколько символов (числа также являются символами) в переменной char, вы должны использовать string или char VARIABLE[size] . Например: char variable[10] может сохранить до 10 символов. Но тогда вы больше не сможете использовать isdigit() таким образом. Вместо этого вы должны использовать цикл для проверки каждого символа строки.

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