- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 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/
我编写了以下词法分析器。它适用于以下输入:c&3&f、(3|6)&c、f^1。然而,我得到的 strtol 结果并不一致。当我运行 #include #include //Max number
我正在使用 strtol 从字符串中解析整数。我打算使用 strtol 的第二个参数来确定整个字符串是否被解析为数字。我有这样的代码(字符串永远不会代表 token; const size_t tok
strtol 规范在概念上将输入字符串分为“初始空白”、“主题序列”和“最终字符串”,并将“主题序列”定义为: the longest initial subsequence of the input
我只是好奇这个。 strtol 不需要您指定要处理的字节数,因此理论上它可能会被提供一个包含无穷无尽的数字序列的字符串以供使用,从而导致拒绝服务攻击。当然,一旦意识到 long 的精度已经用尽(实际上
关闭。这个问题需要 details or clarity 。目前不接受答案。 想要改进这个问题?通过 editing this post 添加详细信息并澄清问题。 已关闭 5 年前。 奥 git _a
这周我刚刚开始学习c。 我正在尝试将单个字符转换为 long/int。 我的问题是,当我通过 main 调用 convenrtCharToInt 时,它返回正确的值,但是当我通过另一个函数调用此函数,
我有这段代码,应该可以正常运行,但由于某种原因,当我在循环的条件检查之前释放字符串时,循环会循环。摆脱循环的唯一方法是给出超过 3 位的整数(输入 > 99 || 输入 #include #inc
当我使用 strtol() 函数时,当我尝试转换时: 2015-08-12 我希望它转换失败而不是仅转换 2015? int main(int argc, char *argv[]) { p
使用指针: char a[]=" 0xa this is a343 good"; char* *endptr=NULL; long int b=0; b=strtol(a,endptr,0); b=s
您好,我制作了一个测试程序,以便在我对以下代码使用 valgrind --track-origins=yes -v ./a.out 时获得如何解决问题的帮助它返回以下错误; ==13192== 1 e
有人可以帮助我理解为什么我看到相同输入的不同输出吗? “n”的输出是 2147483647,这是不正确的。为什么? --------输出------------ FF FF FF FF FFFFFF
strtol 的第二个参数是如何工作的? 这是我尝试过的: strtol(str, &ptr, 10) 其中 ptr 是一个 char * 而 str 是一个字符串。现在,如果我将 str 作为 '3
所以我有两个十六进制字符串 - "3b101c091d53320c000910" 和 "071d154502010a04000419"。当我对它们使用 strtol() 时,我得到两个字符串的相同值。
我正在尝试使用以下代码使用 strtol 将字符数组转换为整数: int foo = strtol(temp, (char **)NULL, 0); 其中温度 = 4000000010 但是 strt
这个问题在这里已经有了答案: strtol using errno (5 个答案) 关闭 8 年前。 基本上使用 strtol 来检查不成功的转换,我正在使用函数 width = (int) st
我真的很困惑。我必须遗漏一些相当简单的东西,但我读到的关于 strtol() 的内容没有任何意义。有人可以用一种非常基本的方式为我阐明它,并举例说明我如何使类似以下的东西起作用吗? string in
根据 C11 (n1570) 中的 § 7.22.1.4,必须声明 strtol: #include long int strtol (const char *restrict nptr,
此代码似乎按预期工作,使用单个指针填充数字数组 #include #include #include int main(void) { int arr[4], count = 0, i;
我这里有一个奇怪的。当我传入以下字符串时,strtol、atol 和 atoi 都返回不正确的值: long test = strtol("3087663490", &p, 10); 根据我的调试器,
我正在围绕 strtol() 创建一个包装函数对于 int16_t ,我遇到了一个问题:如何处理 0x 这样的输入?也就是说,它作为数字有效吗 0 , 后跟非数字 x , 或者它是无效的因为后面没有任
我是一名优秀的程序员,十分优秀!