我想从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
? 最佳答案
不应为endptr
创建指向指针变量的指针。相反,声明一个指针,并用一元&
运算符传递该指针的地址:
char *endptr;
simple_strtol(token, &endptr, 10);
if (endptr == NULL) ...
我没有看手册,但基本上照搬了手术室的使用方法。从manual page开始:
如果主题序列为空或没有预期的形式,则不执行转换;str的值存储在endptr指向的对象中,前提是endptr不是空指针。
这意味着如果
strtol
返回0
和endptr == token
则字符串无效。所以支票应该是
if (value == 0 && endptr == token)
{
/* String is not a valid number */
}