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