gpt4 book ai didi

strtol 可以将第二个参数设置为不在字符串中的值吗

转载 作者:太空宇宙 更新时间:2023-11-04 01:22:47 25 4
gpt4 key购买 nike

我正在使用 strtol 从字符串中解析整数。我打算使用 strtol 的第二个参数来确定整个字符串是否被解析为数字。我有这样的代码(字符串永远不会代表 < 1):

char digits[32];
char* ptr = token->token;
const size_t tokenLen = token->tokenLen;

//token->token may not be NUL terminated
//copy it to temp buffer to ensure it is
for (size_t k = 0; k < tokenLen; k += 1) {
digits[k] = ptr[k];
}
digits[tokenLen] = 0;

long index = strtol(digits, &ptr, 10);

if (
!index || index == LONG_MAX || index >= arr->size
|| (ptr - token->token + 1) != tokenLen
) {
//Error
} else {
//All good
}

但是,这是失败的测试,因为第二个参数 ptr 被设置为与我的字符串无关的地址。我注意到调用后,*ptr 始终为 '\0'(我正在使用 gcc-6 测试字符串 "1")。我在 strtol manpage 中找到了以下文本:

In particular, if *nptr is not '\0' but **endptr is '\0' on return, the entire string is valid.

我想避免简单地检查 *ptr == '\0' 因为字符串可能包含 NUL 字符,这将是理想情况下的错误条件被抓到

(ptr - token->token + 1) != tokenLen

检查 if 语句。

所以我的问题是,strtol 可以将第二个参数设置为不包含在字符串中的地址吗?这种行为是否记录在某处?

最佳答案

问题是您将字符串的副本传递给 strtol,因此 ptr 的值将在副本中,而不是原始值。您还在长度上加 1,这是不正确的。只需更改:

(ptr - token->token + 1) != tokenLen

到:

ptr - digits != tokenLen

关于strtol 可以将第二个参数设置为不在字符串中的值吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37848201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com