确定C字符串是否是C中的有效int

时间:2012-03-17 20:14:44

标签: c string validation int

我需要检查C字符串是否是有效的整数。

我试过了两次

int num=atoi(str);

int res=sscanf(str, "%d", &num);

但是在两行中发送字符串"8 -9 10"只返回8,而没有指出此字符串无效。

有人可以提出替代方案吗?

5 个答案:

答案 0 :(得分:30)

看看strtol(),它可以通过指针返回来告诉你字符串的无效部分。

请注意热心的示例代码..请参阅手册页以获取全面的错误处理。

答案 1 :(得分:7)

也许我会因为没有使用strtol或类似的libc函数而受到抨击,但推理这个问题并不是那么难:

#include <stdbool.h>  // if using C99...  for C++ leave this out.
#include <ctype.h>

bool is_valid_int(const char *str)
{
   // Handle negative numbers.
   //
   if (*str == '-')
      ++str;

   // Handle empty string or just "-".
   //
   if (!*str)
      return false;

   // Check for non-digit chars in the rest of the stirng.
   //
   while (*str)
   {
      if (!isdigit(*str))
         return false;
      else
         ++str;
   }

   return true;
}

[注意:我可能已经做了isdigit(*str++)而不是else来缩短它,但我的回忆是标准说isdigit可能是一个宏。] < / p>

我猜一个限制是,如果字符串中的数字不适合整数,则不会返回false。这对你来说可能有关,也可能没有关系。

答案 2 :(得分:2)

执行此操作的一种简单方法是读取int并确保其字符串表示形式与输入字符串相同,例如组合atoiitoa

int is_int(char const* p)
{
    return strcmp(itoa(atoi(p)), p) == 0;
}

答案 3 :(得分:0)

要检查字符串是否包含有效数字,您可以使用正则表达式。例如,对于整数使用:

?[ - +] [0-9] +

以及浮点数的一般情况:

[+ - ] [0-9] + [0-9] *([EE] [ - +] [0-9] +)?[]?

在C ++ 11的情况下,正则表达式函数在库中是可用的,例如&#34;的std :: regex_match(.....)&#34;给出完全匹配。代码应如下所示:

#include <regex>
.....
std::string strnumber("-1.234e+01");
float number;
if(regex_match(strnumber,std::regex("[+-]?[0-9]+[.]?[0-9]*([eE][-+]?[0-9]+)?"))
number=std::stof(strnumber);
else
std::cout<<"error, string is not a valid number";

答案 4 :(得分:0)

很抱歉挖掘这个主题,但为了完整起见,因为这个帖子是进行谷歌搜索时的第一个匹配...

可以使用以下内容:

ret = sscanf(string, "%d%n", &number, &idx);
if (ret == 0 || string[idx] != '\0')
    /* handle the error */

%n指令,根据手册页似乎是标准C,计算处理的字符数。

[编辑] sscanf似乎没有提供检测溢出的方法,所以strtoX函数系列应该是首选的恕我直言。