C中的char数组问题

时间:2009-11-02 06:41:21

标签: c

char label[8] = "abcdefgh";
char arr[7] = "abcdefg";

printf("%s\n",label);
printf("%s",arr);

====输出==========

  

ABCDEFGH

     

abcdefgÅ

为什么Å附加在字符串arr的末尾? 我在Turbo C ++中运行C代码。

4 个答案:

答案 0 :(得分:14)

printf期望以NUL结尾的字符串。将char数组的大小增加1,为终止NUL字符腾出空间(由= "..."初始化程序自动添加)。

如果你没有NUL终止你的字符串,printf将继续阅读,直到找到一个NUL字符,这样你就会得到或多或少的随机结果。

答案 1 :(得分:6)

您的变量labelarr不是字符串。它们是字符数组。

要成为字符串(并且为了能够将它们传递给< string.h>中声明的函数),它们需要在为它们保留的空间中使用NUL终止符。

标准

中“字符串”的定义
    7.1.1 Definitions of terms
1   A string is a contiguous sequence of characters terminated by and including
    the first null character. The term multibyte string is sometimes used
    instead to emphasize special processing given to multibyte characters
    contained in the string or to avoid confusion with a wide string. A pointer
    to a string is a pointer to its initial (lowest addressed) character. The
    length of a string is the number of bytes preceding the null character and
    the value of a string is the sequence of the values of the contained
    characters, in order.

答案 2 :(得分:4)

您的字符串未终止,因此printf正在运行垃圾数据。您需要在字符串末尾使用'\ 0'。

答案 3 :(得分:2)

使用GCC(在Linux上),它会打印更多垃圾:

abcdefgh°ÃÕÄÕ¿UTÞÄÕ¿UTÞ·
abcdefgabcdefgh°ÃÕÄÕ¿UTÞÄÕ¿UTÞ·

这是因为,您将两个字符数组打印为字符串(使用%s)。

这很好用:

char label[9] = "abcdefgh\0"; char arr[8] = "abcdefg\0";

printf("%s\n",label); printf("%s",arr);

但是,您无需明确提及“\ 0”。只需确保数组大小足够大,即比字符串中的字符数多1个。