我正在使用此函数来解析 CSV 行以处理空项目:
char *strtok_new(char *string, char const *delimiter, char **context)
{
// context unused
static char *source = NULL;
char *p, *ret = 0;
if (string != NULL) source = string;
if (source == NULL) return NULL;
if ((p = strpbrk(source, delimiter)) != NULL)
{
*p = 0;
ret = source;
source = ++p;
}
return ret;
}
使用示例:
char buffer[64]; // "foo,,,,blabla"
const char delimiters[] = ",";
char *token;
char *ptr;
token = strtok_new(buffer, delimiters, &ptr);
// ...
token = strtok_new(NULL, delimiters, &ptr);
if (token == NULL)
{
// do someting
}
比较总是错误的。 我添加了调试
printf
:
Serial.printf("%s,%u,%u\n", token, strlen(token), token[0]);
在其输出的测试用例上:
,0,0
因此我们有一个零长度的字符串,并且(如预期)第一个字节是 0(又名
NULL
)。
为什么 if
子句失败?更改为:
if (strlen(token) == 0)
导致我预期的行为。 我正在使用带有
gnu++2a
标志的适用于 Arduino/ESP32 的 Xtensa 工具链 v8.4.0。
我发现了this问题,但它似乎不适用于这里。
您的问题源于以下方面的混淆:
这也是以下之间的混淆:
您的示例代码无关紧要。您的问题可以如下所示:
char* p1 = NULL;
char* p2 = "";
strlen( p1 ) <-- undefined behavior, usually catastrophic failure
strlen( p2 ) <-- returns 0
int n = (p1 == NULL)? -1 : stlen( p1 ) <-- n receives -1
int n = (p2 == NULL)? -1 : stlen( p2 ) <-- n receives 0