我在学习C的过程中遇到了这个奇怪的字符串问题。我正在玩字符串以及声明字符串和查看其内容的不同方法。
当使用char数组声明字符串然后打印数组的每个元素时,它会产生预期的输出。它打印每个字符,以空字符结束。
当声明字符串文字并打印出结果数组的内容时,我注意到在空字节后字符串上附加了%
个字符。
%
来自何处?
代码如下。我通过编译代码;
$ gcc nameStuff.c -o nameStuff
我在我自己的Mac机器和学校的远程Linux服务器上都尝试了这个,并且两次都获得了相同的输出。
以下是代码:
char myName[] = {72, 97, 121, 100, 101, 110, 0}; // my name in ASCII values
char *name = "Hayden"; // my name as string literal
printf("%s, size: %ld\n", myName, sizeof(myName)); //
printf("%s, size: %ld\n", name, sizeof(name));
int length1 = sizeof(myName);
int length2 = sizeof(name);
int i;
// prints char value of each element in ascii array
for (i = 0; i < length1; i++) {
printf("%c,", myName[i]);
}
puts("");
// prints int value of each element in ascii array
for (i = 0; i < length1; i++) {
printf("%d,", myName[i]);
}
puts("\n");
// prints char value of each element in string literal array
for (i = 0; i < length2; i++) {
printf("%c,", name[i]);
}
puts("");
// prints int value of each element in string literal array
for (i = 0; i < length2; i++) {
printf("%d,", name[i]);
}
puts("");
这是输出:
Hayden, size: 7
Hayden, size: 8
H,a,y,d,e,n,,
72,97,121,100,101,110,0,
H,a,y,d,e,n,,%,
72,97,121,100,101,110,0,37,
我向我的教授询问了这个问题,他说这可能是代码的一个问题,但很难搞清楚这么简单的代码行。在此先感谢您的考虑。
答案 0 :(得分:4)
sizeof
运算符并不意味着计算字符串的长度。在你的情况下,sizeof(char *)
显然是8而"Hayden"
只有6个字符,所以你在实际的字符串文字结尾后打印一个字符(是 null 终结者)。
对于myName
,因为它是一个数组,sizeof
实际上是为了给你数组元素的数量,因为sizeof(char)
是1。
在数组结束后打印元素时,程序会调用未定义的行为。如果你稍微改变你的程序,打印的值会改变,它实际上似乎是"%"
语句中格式说明符中的printf()
之一,也是字符串文字。
然而,你不能预测这个元素会是什么,这只是一个巧合,尝试稍微改变printf()
语句,你会看到差异。
答案 1 :(得分:1)
%只是你不应该阅读的ram中的一些值。正如@BeyelerStudios在评论中指出的那样,sizeof
不是找出字符串长度的正确方法,请使用strlen
。
答案 2 :(得分:1)
myName
是一个字符数组,长度为7个字符,每个char
为1个字节,因此它返回7,如果是7个整数的数组,则每个int
为4个字节在大小,所以它将返回28,因为sizeof()
总是返回它在内存中占用的字节大小。 name
是指向内存的指针,对于32位为4字节长,对于64位为8字节长。您应该始终使用strlen()
来获取C字符串的长度。