Проверить, есть ли в строке только числа в C?

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

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

int main()
{
    char numbers[10];
    int i, correctNum = 0;

    scanf("%s", numbers);

    for(i = 0 ; i <= numbers ; ++i)
    {
        if(isalpha(numbers[i]))
        {
            correctNum = 1;
            break;
        }
    }

    if(correctNum == 1)
    {
        printf("That number has a char in it. FIX IT.\n");
    }
    else
    {
        printf("All numbers. Good.\n");
    }
    return 0;
}

person SycoSins    schedule 21.01.2017    source источник
comment
Определить не работает? Для начала вы не проверяете, все ли числовое. Вы проверяете, есть ли в нем письмо. Вы, вероятно, предпочли бы использовать isdigit()   -  person Sami Kuhmonen    schedule 21.01.2017
comment
Добро пожаловать в Stack Overflow! Похоже, вы просите помочь с домашним заданием. Хотя у нас нет проблем с этим как таковым, обратите внимание на эти что делать и чего не делать и соответствующим образом отредактируйте свой вопрос.   -  person Joe C    schedule 21.01.2017
comment
Используйте положительный тест с isdigit, так как вы можете столкнуться с символами, которые не являются буквами и не цифрами...   -  person Jean-Baptiste Yunès    schedule 21.01.2017
comment
char numbers[10]; довольно мал, предложите 1) char numbers[100]; 2) isdigit() и 3) scanf("%99s", numbers);   -  person chux - Reinstate Monica    schedule 21.01.2017
comment
@JoeC Это всего лишь очень маленькая часть значительно более крупного проекта, над которым я работаю. Меня никогда не учили этому в школе, я просто пытаюсь реализовать некоторые дополнительные изящные функции.   -  person SycoSins    schedule 21.01.2017
comment
i <= numbers — это ошибка, и ваш компилятор должен был ее диагностировать. Обратите внимание на сообщения компилятора.   -  person M.M    schedule 21.01.2017


Ответы (5)


Добавляя к другим ответам, вы также можете использовать strtol для определить, содержит ли строка все числа или нет. Он в основном преобразует строку в целое число и пропускает любые нецелые числа. Вы можете прочитать справочную страницу для получения дополнительной информации об этой функции. , и обширную проверку ошибок, которую вы можете сделать с ним.

Кроме того, вы должны использовать:

scanf("%9s", numbers);

Вместо:

scanf("%s", numbers);

Чтобы избежать переполнения буфера.

Вот пример кода:

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

#define MAXNUM 10
#define BASE 10

int main(void) {
    char numbers[MAXNUM];
    char *endptr;
    int number;

    printf("Enter string: ");
    scanf("%9s", numbers);

    number = strtol(numbers, &endptr, BASE);

    if (*endptr != '\0' || endptr == numbers) {
        printf("'%s' contains non-numbers\n", numbers);
    } else {
        printf("'%s' gives %d, which has all numbers\n", numbers, number);
    }

    return 0;
}

Пример ввода 1:

Enter string: 1234

Выход:

'1234' gives 1234, which has all numbers

Пример ввода 2:

Enter string: 1234hello

Выход:

'1234hello' contains non-numbers
person RoadRunner    schedule 21.01.2017

for(i = 0 ; i <= numbers ; ++i) //how is this supposed to work.

Запустите цикл от 0 до 1 меньше, чем length входных данных.

for(i = 0 ; i < strlen(numbers) ; ++i)
person Gaurav Sehgal    schedule 21.01.2017
comment
Почему бы также не упомянуть, что защита от петель может быть numbers[i] != '\0. Это больше похоже на C. - person RoadRunner; 21.01.2017

Вы можете использовать strspn:

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]) {
    int i;
    for (i=1; i < argc; i++) {
        printf("%s %s\n",
            strlen(argv[i]) == strspn(argv[i], "0123456789") ? "digits" : "mixed",
            argv[i]
        );
    }
}

Демо:

$ ./try foo 123 ba23a 123.4
mixed foo
digits 123
mixed ba23a
mixed 123.4

strspn возвращает начальное количество символов из первого аргумента, которые появляются во втором аргументе. Супер простые примеры:

strspn("abba", "a");  // == 1
strspn("abba", "b");  // == 0
strspn("abba", "ab"); // == 2
person bishop    schedule 05.10.2017

У вас ошибка в цикле for - for(i = 0 ; i ‹= numbers ; ++i)

числа являются указателем, и сравнение его с целым числом запрещено. Правильный код -

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

int main()
{
   char numbers[10];
   int i, correctNum = 0;

    scanf("%s", numbers);

    for(i = 0 ; i < strlen(numbers) ; ++i)
    {
       if(!(numbers[i]>='0' && numbers[i]<='9'))
       {
           correctNum = 1;
            break;
       }
    }

    if(correctNum == 1)
    {
         printf("That number has a char in it. FIX IT.\n");
     }
   else
    {
        printf("All numbers. Good.\n");
    }
    return 0;
 }
person GAURANG VYAS    schedule 21.01.2017
comment
Было бы лучше использовать !isdigit(numbers[i]) вместо !(numbers[i] >= ... - person linuxfan says Reinstate Monica; 21.01.2017
comment
сильно ли это повлияет на КПД? @linuxfan - person GAURANG VYAS; 21.01.2017
comment
как функция isdigit() реализована внутри? @linuxfan - person GAURANG VYAS; 21.01.2017
comment
это не для эффективности, а для краткости, ясности и правильности. В любом случае isdigit() если не более эффективен, то уж точно не менее. - person linuxfan says Reinstate Monica; 21.01.2017
comment
Я тоже сказал правильность. Не думайте, что программы на C всегда выполняются в системах ascii. Прочитайте это: en.wikipedia.org/wiki/C_character_classification - person linuxfan says Reinstate Monica; 21.01.2017
comment
Спасибо! Это также работает, когда единственный код, который я меняю, — это числа в цикле for на strlen(numbers). - person SycoSins; 21.01.2017
comment
Говоря об эффективности: во-первых, вы хотите удалить вызов strlen в константной строке из оператора for. - person alk; 21.01.2017
comment
Почему не просто numbers[i] != '\0' в качестве охранника? - person RoadRunner; 21.01.2017

person    schedule
comment
ваш код неверен. Для условия цикла должно быть i‹strlen(числа), а не i‹=10. Проверьте свой код на ввод 12345, он выдаст неверный вывод. - person GAURANG VYAS; 21.01.2017
comment
Извини, я виноват!!! Я только что отредактировал его код и забыл удалить это =. Отредактировал. Спасибо @GAURANG Отдых заверяет. - person Shreyas Patil; 21.01.2017
comment
ты не понял. strlen(числа) не всегда будет 10. 10 здесь просто означает максимальную длину вводимой строки. Вам нужно будет заменить 'i‹10' на 'i‹strlen(numbers)'. @Шреяс - person GAURANG VYAS; 21.01.2017
comment
Да, я знаю @Gaurang. Я просто пытался дать ему ответ. Это оно. - person Shreyas Patil; 22.01.2017