为什么strtol会返回错误的值?

时间:2014-12-17 20:01:25

标签: c strtol

char xs[7] = {'0','0','0','1','0','1','0'};
long ss = strtol(xs, NULL, 2);
第二行ss后是2147483647,有什么想法吗?以下代码在循环中(外部工作正常)

1 个答案:

答案 0 :(得分:1)

strtol期望NUL终止字符串。您的数组声明创建一个7字符数组,并使用非NUL数据填充所有7个位置。因此,strtol实际上会继续查找堆栈(或通过内存),直到找到终止字符。

您可以使用多种方法声明char数组并正确初始化它。如果它是只读数组,我更喜欢:

char xs[] = "0001010";

将创建一个足以容纳字符串文字的数组(包括其终止NUL)。

上述评论中显示了其他选项

char xs[7+1] = "0001010\0";
char xs[7+1] = {'0','0','0','1','0','1','0',0};
char xs[ ] = {'0','0','0','1','0','1','0',0};

我的方法或上面的最后一个方法的优点是你不需要计算字符数,如果你改变字符串,编译器会调整。

在上面的第一个例子中,\0是表示ASCII NUL字符的转义序列。它优于普通0,因为(a)它具有正确的类型(char)以包含在字符串文字中,并且(b)大多数语法感知编辑器将突出显示它,如NUL在文字中间可以有惊人的结果。例如

   strlen("abc\0def") == 3