如何从simple_strtol()获取错误状态? (在C中将字符串转换为int)

时间:2012-11-21 04:00:16

标签: c linux

我想从C中的intstring)解析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

1 个答案:

答案 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 */
}