我想从C中的int
(string
)解析char*
。我正在为嵌入式Linux编写一个linux内核模块。我正在尝试simple_strtol
找到here。
我在理想情况下解析的令牌将是数字。我遇到的问题是"0"
是一个有效的输入。如果无法解析值,则strtol
返回0
(错误)。这意味着以下代码:
char* token = "should_fail";
char **endptr;
char value = simple_strtol(token, endptr, 10); // 10 is the base to convert to
if (!**endptr){
printf("failed!");
} else {
printf(value);
}
char* token = "0"; // should pass
char **endptr;
char value = simple_strtol(token, endptr, 10); // 10 is the base to convert to
if (!**endptr){
printf("failed!");
} else {
printf(value);
}
在这两种情况下打印0
,在第一种情况下应该失败。我试图使用*endptr
参数来检查转换是否成功,但它不起作用。根据我研究的内容,*endptr
是“指向已解析字符串末尾的指针将放在此处”。我相信如果转换失败,指针将指向任何内容,以便我可以识别出失败。
是否有人知道我如何正确解析"0"
并获得0
的返回值,同时仍然识别失败的解析,而不是让它返回0
?
答案 0 :(得分:3)
您不应为endptr
创建指针指针变量。而是声明一个指针,并使用一元&
运算符传递该地址:
char *endptr;
simple_strtol(token, &endptr, 10);
if (endptr == NULL) ...
我没有阅读手册页,但基本上复制了OP使用的内容。修饰manual page:
如果主题序列为空或者没有预期的形式,则不进行转换; str的值存储在endptr指向的对象中,前提是endptr不是空指针。
这意味着,如果strtol
(或您的替代方案,如果它按指定工作)返回0
和 endptr == token
,那么该字符串无效。
所以检查应该是
if (value == 0 && endptr == token)
{
/* String is not a valid number */
}