Как проверить, является ли строка числом?
Я хочу проверить, является ли строка номером с этим кодом. Я должен проверить, что все символы в строке целые, но возвращаемое значение всегда равно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(), если проверка на целое число.