我需要检查C字符串是否是有效的整数。
我试过了两次
int num=atoi(str);
和
int res=sscanf(str, "%d", &num);
但是在两行中发送字符串"8 -9 10"
只返回8,而没有指出此字符串无效。
有人可以提出替代方案吗?
答案 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并确保其字符串表示形式与输入字符串相同,例如组合atoi
和itoa
:
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函数系列应该是首选的恕我直言。