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

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

char tmp[16]; scanf("%s", tmp); int isDigit = 0; int j=0; while(j 57 && tmp[j] < 48) isDigit = 0; else isDigit = 1; j++; } 

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

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

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

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

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

Ваше условие if всегда будет ложным, в результате значение isDigit всегда будет 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 

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

 while(j в while(j 

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

 /* 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; } } 

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

 #include  #include  #include  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]); } } } 

Ваше состояние говорит, что 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)