【问题标题】:How to check if a particular string is a numeric value of character value?如何检查特定字符串是否是字符值的数值?
【发布时间】:2015-01-10 18:09:25
【问题描述】:

我想了解如何验证字符串输入并检查输入的字符串是否为数字?我相信 isdigit() 函数是正确的方法,但是我可以用一个字符来尝试它,但是当涉及到字符串时,该函数对我没有帮助。这就是我到目前为止所得到的,可以任何请指导我验证完整的字符串,如

char *Var1 ="12345" 和 char *var2 ="abcd"

#include <stdio.h>
#include <ctype.h>

int main()
{
   char *var1 = "hello";
   char *var2 = "12345";

   if( isdigit(var1) )
   {
      printf("var1 = |%s| is a digit\n", var1 );
   }
   else
   {
      printf("var1 = |%s| is not a digit\n", var1 );
   }
   if( isdigit(var2) )
   {
      printf("var2 = |%s| is a digit\n", var2 );
   }
   else
   {
      printf("var2 = |%s| is not a digit\n", var2 );
   }

   return(0);
}

当变量如下声明和初始化时,程序似乎工作正常,

int var1 = 'h'; int var2 = '2';

但我想了解如何验证完整的字符串,例如 *var =" 12345";

【问题讨论】:

  • 阅读isdigit的文档!它仅适用于单个字符。 (所以下一步应该是合乎逻辑的。)
  • 您需要遍历数组,将 isdigit 应用于每个字符并检查返回值。

标签: c string


【解决方案1】:

尝试对每个字符串进行循环并单独验证每个字符

【讨论】:

    【解决方案2】:

    isdigit 接受单个 char,而不是 char*。如果你想使用isdigit,添加一个循环来做检查。由于您打算在多个地方使用它,因此将其制成一个函数,如下所示:

    int all_digits(const char* str) {
        while (*str) {
            if (!isdigit(*str++)) {
                return 0;
            }
        }
        return 1;
    }
    

    当到达字符串的空终止符而没有碰到中间的return 语句时,上面的循环将结束,换句话说,当所有字符都通过了isdigit 测试时。

    请注意,传递all_digits 确实意味着该字符串表示任何支持的数字类型的值,因为不考虑字符串的长度。因此,对于 all_digits,很长的数字字符串会返回 true,但如果您尝试将其转换为 intlong long,则会出现溢出。

    【讨论】:

    • 这似乎是最简单的解决方案。谢谢大家:)
    【解决方案3】:

    使用这个

    int isNumber(const char *const text)
    {
        char *endptr;
        if (text == NULL)
            return 0;
        strtol(text, &endptr, 10);
    
        return (*endptr == '\0');
    }
    

    然后

    if (isNumeric(var1) == 0)
        printf("%s is NOT a number\n", var1);
    else
        printf("%s is number\n", var1);
    

    strtol() 函数将忽略前导空白字符。

    如果找到无法转换的字符,则转换停止,endptr 将在返回后指向该字符,因此检查 *endptr == '\0' 将告诉您您是否位于字符串的末尾,这意味着成功转换的所有字符。

    如果您也想将前导空格视为无效字符,那么您可以改为这样写

    int isNumber(const char *text)
    {
        char *endptr;
        if (text == NULL)
            return 0;
        while ((*text != '\0') && (isspace(*text) != 0))
            text++;
        if (*text == '\0')
            return 0;
        strtol(text, &endptr, 10);
    
        return (*endptr == '\0');
    }
    

    取决于您的需要,但跳过前导空白字符是将数字解释为好像人类正在阅读它们,因为人类“看不到”空白字符。

    【讨论】:

    • strtol 跳过前导空格,因此 OP 的问题是是否允许这样做。
    • 感谢大家分享代码sn-p和解释逻辑。我先理解逻辑并尝试一下,一会儿让你知道结果:)
    猜你喜欢
    • 2018-09-28
    • 2014-01-08
    • 1970-01-01
    • 2010-11-16
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 2017-12-16
    相关资源
    最近更新 更多