Как проверить, является ли строка числом?

Я хочу проверить, является ли строка номером с этим кодом. Я должен проверить, что все символы в строке целые, но возвращаемое значение всегда равноDigit = 1. Я не знаю, почему это, если не работает.

char tmp[16];
scanf("%s", tmp);

int isDigit = 0;
int j=0;
while(j<strlen(tmp) && isDigit == 0){
  if(tmp[j] > 57 && tmp[j] < 48)
    isDigit = 0;
  else
    isDigit = 1;
  j++;
}

Ответ 1

Забудьте о проверке кода ASCII, используйте isdigit или isnumber (см. man isnumber). Первая функция проверяет, является ли символ 0-9, второй также принимает различные другие номера символов в зависимости от текущей локали.

Могут быть даже лучшие функции для проверки - важный урок состоит в том, что это немного сложнее, чем выглядит, потому что точное определение "числовой строки" зависит от конкретной локали и строковой кодировки.

Ответ 2

  if(tmp[j] >= '0' && tmp[j] <= '9') // should do the trick

Ответ 3

В этой части вашего кода:

if(tmp[j] > 57 && tmp[j] < 48)
  isDigit = 0;
else
  isDigit = 1;

Ваше условие if всегда будет ложным, в результате isDigit всегда будет установлено на 1. Вероятно, вы хотите:

if(tmp[j] > '9' || tmp[j] < '0')
  isDigit = 0;
else
  isDigit = 1;

Но. это можно упростить, чтобы:

isDigit = isdigit(tmp[j]);

Однако логика вашего цикла кажется ошибочной:

int isDigit = 0;
int j=0;
while(j<strlen(tmp) && isDigit == 0){
  isDigit = isdigit(tmp[j]);
  j++;
}

Вы должны выйти из цикла, как только обнаружите не цифру. Поэтому логику while следует изменить:

while(j<strlen(tmp)){
  isDigit = isdigit(tmp[j]);
  if (isDigit == 0) break;
  j++;
}

Ответ 4

Более очевидный и простой потокобезопасный пример:

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

int main(int argc, char **argv)
{
    if (argc < 2){
        printf ("Dont' forget to pass arguments!\n");
        return(-1);
    }

    printf ("You have executed the program : %s\n", argv[0]);

    for(int i = 1; i < argc; i++){
        if(strcmp(argv[i],"--some_definite_parameter") == 0){
            printf("You have passed some definite parameter as an argument. And it is \"%s\".\n",argv[i]);
        }
        else if(strspn(argv[i], "0123456789") == strlen(argv[i])) {
            size_t big_digit = 0;
            sscanf(argv[i], "%zu%*c",&big_digit);
            printf("Your %d'nd argument contains only digits, and it is a number \"%zu\".\n",i,big_digit);
        }
        else if(strspn(argv[i], "0123456789abcdefghijklmnopqrstuvwxyz./") == strlen(argv[i]))
        {
            printf("%s - this string might contain digits, small letters and path symbols. It could be used for passing a file name or a path, for example.\n",argv[i]);
        }
        else if(strspn(argv[i], "ABCDEFGHIJKLMNOPQRSTUVWXYZ") == strlen(argv[i]))
        {
            printf("The string \"%s\" contains only capital letters.\n",argv[i]);
        }
    }
}

Ответ 5

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

/* Prompt user for input */
printf("Enter a number: ");

/* Read user input */
char input[255]; //Of course, you can choose a different input size
fgets(input, sizeof(input), stdin);

/* Strip trailing newline */
size_t ln = strlen(input) - 1;
if( input[ln] == '\n' ) input[ln] = '\0';

/* Ensure that input is a number */
for( size_t i = 0; i < ln; i++){
    if( !isdigit(input[i]) ){
        fprintf(stderr, "%c is not a number. Try again.\n", input[i]);
        getInput(); //Assuming this is the name of the function you are using
        return;
    }
}

Ответ 6

Ваше состояние говорит if X is greater than 57 AND smaller than 48. X не может быть одновременно больше 57 и меньше 48.

if(tmp[j] > 57 && tmp[j] < 48)

Это должно быть if X is greater than 57 OR smaller than 48:

if(tmp[j] > 57 || tmp[j] < 48)

Ответ 7

if ( strlen(str) == strlen( itoa(atoi(str)) ) ) {
    //its an integer
}

Поскольку atoi преобразует строку в пропущенные числа, отличные от цифр, если не было ничего, кроме цифр, длина строки должна быть такой же, как и в оригинале. Это решение лучше, чем innumber(), если проверка на целое число.