C: Очень важно, что параметр является параметром int - PullRequest
0 голосов
/ 01 ноября 2010

В моей программе мне нужно убедиться, что параметр, переданный в программу, является целым числом, поэтому я создал эту маленькую функцию для обработки случая, когда пользователь вводил «1-й» вместо «1».

Проблема в том, что он вообще не работает.Я пробую отладку, и все, что я могу вам сказать, это то, что параметры равны 12, а long равен 2. (12 - это значение, которое я хочу проверить, а 2 - это число чисел, переданных в функцию)*

Надеюсь, что все понятно, спасибо за помощь;)

Ответы [ 9 ]

11 голосов
/ 01 ноября 2010

Если вы хотите проверить, является ли символ одной из десяти цифр, вам необходимо использовать символьные константы '0', '1' и т. Д. (Не целочисленные константы, 0, 1 и т. Д.).

7 голосов
/ 01 ноября 2010

После того, как вы исправили проблемы, которые уже были указаны, вам, вероятно, следует поискать isdigit и isspace и использовать их, чтобы написать функцию намного более четко.Другая возможность - использовать что-то вроде strcspn или strpbrk, чтобы выполнить поиск за один шаг.

5 голосов
/ 01 ноября 2010

Просто используйте strtol, это преобразует целое число, и вы можете определить по третьему параметру, удалось ли это.

Описание см. strtol (3)

1 голос
/ 01 ноября 2010

Я предполагаю, что вы имеете в виду положительное целое число, так как ваш код потерпит неудачу, если передаются отрицательные числа, аналогично, если передаются экспоненты (например, 1000 как 1e3). Последнее, вероятно, редкость, о которой вам стоит беспокоиться, но о первом можно подумать - я не знаю, с какой целью вы проверяете, но просто хедз-ап: -)

1 голос
/ 01 ноября 2010

Вы можете упростить свою жизнь и сократить код, если будете использовать ctype.h , в частности isdigit или

if(toCheck[i] >= '0' && toCheck[i] <= '9' || toCheck[i] == ' '){
1 голос
/ 01 ноября 2010

Вы можете использовать функции isdigit и isspace как:

int intOnly(char *toCheck, int len) { // long is reserved word..use len.
    int i = 0; 
    while (i < len) {
        if(!isdigit(toCheck[i]) && !isspace(toCheck[i]))
            return 0;
        i++;
    }
    return 1;
}

Также long - это ключевое слово, которое нельзя использовать в качестве идентификатора.

1 голос
/ 01 ноября 2010

В дополнение к другим ответам рассмотрите возможность использования isdigit.Также рассмотрите возможность переименования вашей функции, чтобы отразить ее действительность (например, intsAndSpacesOnly)

1 голос
/ 01 ноября 2010

Возможно, вы захотите добавить оператор break; после оператора i++;. В противном случае вы всегда будете «проваливаться» через ветку default и возвращать 0.

1 голос
/ 01 ноября 2010

Во-первых, я удивлен, что ваш код проходит компиляцию с переменной long. Однако ваша реальная проблема заключается в том, что вы используете цифры 0-9, а не символы '0' - '9' в переключателе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...