检查字符串是否为数字

时间:2016-04-08 13:57:58

标签: c

请您检查此功能有什么问题?此函数检查字符串是否为数字。如果它是数字(允许正整数和负整数),则返回值1.否则,它返回0.我试图运行代码,输出总是返回0.

{int is_valid (char strval[])
{
int strlen, ascii_code, i;
int decimal=-1, negative=-1;

strlen=strlen_safe(strval);

for (i=0; i<strlen; i++)
{
    ascii_code=(int)strval[i];

    if(ascii_code==44)
        return 0;
    else if(ascii_code==45)
    {
        negative++;
        if(negative||i!=0)
            return 0;
    }
    else if(ascii_code==46)
    {
        decimal++;
        if(decimal>0)
            return 0;
    }
    else if(ascii_code<48||ascii_code>57)
        return 0;
}
return 1;
}

2 个答案:

答案 0 :(得分:0)

如果您检查字符串是当前平台上的数字(可能不使用ASCII作为其编码),那么您应该使用strtod()。它将处理浮点数可以格式化的所有微妙方式,并且通常对用户来说更好:

#include <stdlib.h>

int is_valid_number(const char *s, size_t maxdigits)
{
  char *endp;

  strtod(s, &endp);
  const size_t digits = (size_t) (endp - s);
  return *endp == '\0' && digits <= maxdigits;
}

以上是非常保守的,它要求传入字符串的所有字符都是数字的一部分。这意味着"43 "(注意尾随空格)将被拒绝。

要使其仅接受前缀,请将最后一行更改为

return endp != s;

答案 1 :(得分:0)

您不需要将strval[i]转换为int

如果'-'不出现在字符串的开头,它仍会将字符串视为数字。

如果strlen_safe是您自己的函数,则可能是代码失败的地方。

此代码应该有效。

int is_valid (char strval[])
{
    if(!*strval)
        return 0;
    if(*strval=='-')
        strval++;
    char decimal=0;
    while(*strval)
    {
        if(!isdigit(*strval))
        {
            if(*strval=='.')
            {
                if(decimal)
                    return 0;
                decimal=1;
            }
            else
                return 0;
        }
        strval++;
    }
    return 1;
}
相关问题