функция не выполняется C - PullRequest
1 голос
/ 04 апреля 2020

Итак, у меня есть функция IsNumber(), которая проверяет, является ли введенный пользователем номер или нет, если программа не останавливается, однако по какой-то причине эта функция просто не работает.

Вот где это реализовано:

bool IsNumber(const char* pStr);

int main()
{
    int user;
    char decision;
    char * str[256] = {user};
    bool valid;

    scanf("%d",&user);

    clear_stdin(); // function to remove

    sprintf(str, "%d", user); // to convert input into string so to validate number with function IsNumber

    valid = IsNumber(str);

    if (valid == false)
    {
        printf("Entered input is not a number, exiting now.");
        exit(1);
    }
 }

А вот и сама функция:

bool IsNumber(const char* pStr)
{
    if(NULL == pStr || *pStr == "\0")
        return false;

    int dotCount = 0;
    int plusCount = 0;
    int minusCount = 0;

    while (*pStr)
    {
        char c = *pStr;
        switch(c)
        {
        case '.':
             if (++dotCount > 1)
                return false;
             break;
        case '-':
            if (++minusCount > 1)
                return false;
             break;
        case '+':
            if (++plusCount > 1)
               return false;
        default:
            if (c < '0' || c > '9')
                return false;
         }
        pStr++;
    }
    return true;
}

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

ваша функция не проверяет большинство ошибок (например, 345 + 456). Вы должны помнить, что некоторые символы могут быть только в определенных местах, чтобы сделать номер действительным. Вот вам немного лучше (очень просто ради простоты ответа).

int isNumber(const char *str)
{
    int result = 1;
    int dotFound = 0;
    const char *saved = str;

    if(str || *str)
    {
        while(*str && result)
        {
            if(*str == '-' || *str == '+')
            {
                 if(str != saved) result = 0;
            }
            else
            {
                if(*str == '.') 
                {
                    if(dotFound) result = 0;
                    dotFound = 1;   
                }
                else
                {
                    if(!isdigit(*str)) result = 0;
                }
            }
            str++;
        }
    }
    return result;
}

Ваша тестовая идея неверна. sprintf всегда будет печатать действительный номер int. он также никогда не сгенерирует строку с точкой '.' внутри.

https://godbolt.org/z/d_Bah9

1 голос
/ 04 апреля 2020

Есть несколько проблем с вашим кодом:

Строка

char *str[256] = {user};

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

Строка

sprintf(str, "%d", user);

str недопустима аргумент, вы можете использовать str[0], но, опять же, str[0] указывает на никуда.

Строка

if(NULL == pStr || *pStr == "\0")
                            ^^^^

Вы сравниваете один символ со строкой, допустимое сравнение будет:

if(NULL == pStr || *pStr == '\0')
                            ^^^^

Другие проблемы:

  • Отсутствует break в case '+'.
  • char decision никогда не используется.
...