C中的字符串文字以%结尾?

时间:2016-02-04 18:10:49

标签: c arrays string

我在学习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,

我向我的教授询问了这个问题,他说这可能是代码的一个问题,但很难搞清楚这么简单的代码行。在此先感谢您的考虑。

3 个答案:

答案 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字符串的长度。