gpt4 book ai didi

c - strtol 的正确行为是什么?

转载 作者:太空狗 更新时间:2023-10-29 15:28:38 27 4
gpt4 key购买 nike

我正在围绕 strtol() 创建一个包装函数对于 int16_t ,我遇到了一个问题:如何处理 0x 这样的输入?也就是说,它作为数字有效吗 0 , 后跟非数字 x , 或者它是无效的因为后面没有任何内容 0x

tl;dr 结果:Windows 拒绝 0x完全如后一种情况所述,但 Debian 将其视为数字 0 , 后跟非数字字符 x ,如前一个案例中所述。

实现测试1

  • window
    • Visual C++ 2015(以下简称 MSVC)
    • MinGW-w64 GCC (5.2.0)
  • Debian

为了进一步比较,我包括了 sscanf()格式规范为 " %li" ,它应该表现得像 strtol()base==0 .令人惊讶的是,我最终得到了两个不同的结果。

代码:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
const char *foo = " 0x";
char *remainder;
long n;
int base = 0;

n = strtol(foo, &remainder, base);
printf("strtol(): ");
if (*remainder == 'x')
printf("OK\n");
else {
printf("NOMATCH\n");
printf(" Remaining -- %s\n", remainder);
printf(" errno: %s (%d)\n", strerror(errno), errno);
}

errno = 0;

base = sscanf(foo, " %li", &n);
printf("sscanf(): ");
if (base == 1)
printf("OK\n");
else {
printf("NOMATCH\n");
printf(" Returned: %s\n", base==0 ? "0" : "EOF");
printf(" errno: %s (%d)\n", strerror(errno), errno);
}
}

Debian 结果:

strtol(): OK
sscanf(): OK

Windows 结果:

strtol(): NOMATCH
Remaining -- 0x
errno: No error (0)
sscanf(): NOMATCH
Returned: 0
errno: No error (0)

无论如何都没有错误,但结果却不同。正在初始化 base到 16 而不是 0 没有任何区别,也没有删除测试字符串中的前导空格。

老实说,我期待我在 Debian 上得到的结果:0被解析为有效值(base 是 0 还是 16),并且 remainder设置为指向 x在看到 x 之后没有有效的十六进制值之后(如果有的话,0x 将被跳过,无论 base 是 0 还是 16)。

所以现在我对这种情况下的正确行为感到困惑。这两种行为是否违反了C标准?我对标准相关部分的解释是 Debian 是正确的,但我真的不确定。


1 Cygwin 在 strtol() 的情况下展示了 Windows 行为以及 sscanf() 情况下的 Debian 行为对于那些有兴趣的人。由于行为是 %li应该匹配 strtol()base==0 ,我认为这是一个错误并忽略了它的结果。

最佳答案

C11 7.22.1.4 规范:

  1. If the value of base is zero, the expected form of the subject sequence is that of an integer constant as described in 6.4.4.1,

  2. The subject sequence is defined as the longest initial subsequence of the input string, starting with the first non-white-space character, that is of the expected form

如 6.4.4.1 所述,0 是整数常量,但 0x 不是。因此,对于您的输入案例,主题序列是 0

所以正确的行为是返回0endptr应该指向x

关于c - strtol 的正确行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36831163/

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