如何检查字符串是否为数字?

时间:2013-05-20 07:49:46

标签: c string

我想检查一个字符串是否是带有此代码的数字。我必须检查字符串中的所有字符都是整数,但是while返回总是isDigit = 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++;
}

10 个答案:

答案 0 :(得分:31)

忘记ASCII代码检查,使用isdigitisnumber(请参阅man isnumber)。第一个函数检查字符是否为0-9,第二个函数还接受各种其他数字字符,具体取决于当前的语言环境。

甚至可能有更好的功能来进行检查 - 重要的一点是,这比看起来要复杂一些,因为“数字字符串”的精确定义取决于特定的语言环境和字符串编码。 / p>

答案 1 :(得分:7)

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

答案 2 :(得分:3)

在这部分代码中:

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

您的if条件始终为false,导致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++;
}

答案 3 :(得分:2)

我需要为我目前正在进行的项目做同样的事情。以下是我解决问题的方法:

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

答案 4 :(得分:2)

更明显和简单,线程安全的例子:

#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 :(得分:0)

你的病情是if X is greater than 57 AND smaller than 48X不能同时大于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)

答案 6 :(得分:0)

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

由于atoi将字符串转换为数字以外的数字跳号字母,如果没有数字,则其字符串长度必须与原始数字相同。 如果检查整数,则此解决方案比innumber()更好。

答案 7 :(得分:0)

#include <stdio.h>
#include <string.h>
char isNumber(char *text)
{
    int j;
    j = strlen(text);
    while(j--)
    {
        if(text[j] > 47 && text[j] < 58)
            continue;

        return 0;
    }
    return 1;
}
int main(){
    char tmp[16];
    scanf("%s", tmp);

    if(isNumber(tmp))
        return printf("is a number\n");

    return printf("is not a number\n");
}

您还可以检查其字符串值,该值也可以与非Ascii一起使用

char isNumber(char *text)
{
    int j;
    j = strlen(text);
    while(j--)
    {
        if(text[j] >= '0' && text[j] <= '9')
            continue;

        return 0;
    }
    return 1;
}

答案 8 :(得分:0)

重写整个函数,如下所示:

bool IsValidNumber(char * string)
{
   for(int i = 0; i < strlen( string ); i ++)
   {
      //ASCII value of 0 = 48, 9 = 57. So if value is outside of numeric range then fail
      //Checking for negative sign "-" could be added: ASCII value 45.
      if (string[i] < 48 || string[i] > 57)
         return FALSE;
   }

   return TRUE;
}

答案 9 :(得分:0)

问题在于您的代码“ isDigit”的结果仅反映了最后一位数字的测试。据我了解您的问题,只要字符串中包含不是数字的任何字符,就想返回isDigit = 0。按照您的逻辑,您应该这样编码:

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

int isDigit = 0;
int j=0;
isDigit = 1;  /* Initialised it here */
while(j<strlen(tmp) && isDigit == 0){
  if(tmp[j] > 57 || tmp[j] < 48) /* changed it to OR || */
    isDigit = 0;
  j++;
}

要获得更易懂的代码,我还要更改测试:

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

到以下:

if(tmp[j] > '9' || tmp[j] < '0')