Как проверить int или char в c - PullRequest
       89

Как проверить int или char в c

1 голос
/ 21 сентября 2019

У меня есть код, в котором я конвертирую градусы Цельсия в градусы Фаренгейта.И мне нужно проверить, что пользователь пишет char или int.

Я пробовал isalpha и isdigit, но они не работают.

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

int main()
{
    char t[] = "";
    scanf("%s", &t);
    if(isalpha(t))
    {
        printf("It's char\n");
    }
    else if (isdigit(t))
    {
        printf("It's int\n");
    }


    return 0;
}

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Во-первых:

char t[] = "";

создает буфер ровно из одного символа, затем

scanf("%s", t);

переполнит этот буфер для чего угодно, кроме ввода пустой строки.Обеспечить защиту scanf() от переполнения не так просто, но даже в этом случае наиболее наивная реализация будет иметь практическую длину буфера, например:

char t[128] = "" ;

Если ожидается ввод строки, которая может быть преобразована в int, тогда 10 десятичных цифр достаточно для всех положительных 32-битных целых чисел.

scanf("%10s", t);

char и int являются типами данных, здесь пользователь только когда-либо вводит строку.Ваш вопрос действительно заключается в том, ввел ли пользователь что-то, что может быть интерпретировано как целое число или нет.

isalpha() и isdigit() работают с одиночными символами, но t является строкой.

Следующая команда проверит первый символ строки t:

if( isdigit(t[0]) )
{
    printf("It's digit\n");
}
else
{
    printf("It's not a digit\n");
}

Обратите внимание, что проверка на isalpha() не имеет смысла, поскольку объединение всех цифр + всей альфы все ещеподмножество всех символов .

Если на самом деле вы просто хотите проверить, что вся строка является числовой, то:

for( int i = 0; t[i] != 0 && isdigit(t[i]) i++ )
{
    // nothing
} 

if( t[i] == 0 )
{
     printf("It's numeric\n");
}
else
{
     printf("It's not entirely numeric\n");
}

Даже тогда это не то, чточисловая строка может быть представлена ​​int;это также должно быть в диапазоне.Возможно, вы захотите рассмотреть возможность знака - / + в начале и можете игнорировать завершающие нечисловые цифры.

1 голос
/ 21 сентября 2019

isalpha и isdigit применяются к объектам типа int, которые содержат символ.

Вы пытаетесь применить эти функции к объекту типа char * (тип массива неявнопреобразуется в выражения указателя в выражениях).

Более того, массив t, объявленный как

char t[] = "";

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

scanf("%s", &t);
            ^^^

Он должен быть записан, по крайней мере, как

scanf("%s", t);

Вы можете объявить объект типа char как

char t;

, а затем используйте scanf как

scanf(" %c", &t);

и наконец

if ( isalpha( ( unsigned char )t ) )
{
    printf("It's char\n");
}
else if ( isdigit( ( unsigned char )t ) )
{
    printf("It's int\n");
}
...