我想从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

最佳答案

不应为endptr创建指向指针变量的指针。相反,声明一个指针,并用一元&运算符传递该指针的地址:

char *endptr;

simple_strtol(token, &endptr, 10);

if (endptr == NULL) ...

我没有看手册,但基本上照搬了手术室的使用方法。从manual page开始:
如果主题序列为空或没有预期的形式,则不执行转换;str的值存储在endptr指向的对象中,前提是endptr不是空指针。
这意味着如果strtol返回0endptr == token则字符串无效。
所以支票应该是
if (value == 0 && endptr == token)
{
    /* String is not a valid number */
}

08-26 22:04