我需要使用特殊字符字符串,如:!,",#,~
等
如果我这样做:
char arr[10] = "''''''''''";
char arr1[10] = "!!!!!!!!!!";
char arr2[10] = "##########";
printf("%st%st%sn",arr,arr1,arr2);
则CCD_ 2打印该字符串和一些垃圾。
我哪里错了?
Characters数组(也称为C字符串)以null结尾,因此需要在数组中添加一个额外的索引来存储null字符。如果你需要一个10个字符的字符串,你需要创建一个可以存储11个字符(空字符' '
的额外字符)的字符串
所以,把你的代码改为
char arr[11] = "''''''''''";
char arr1[11] = "!!!!!!!!!!";
char arr2[11] = "##########";
printf("%st%st%sn",arr,arr1,arr2);
或者更好的是,正如@TheParamagneticCroissant所建议的,你可以进行
char arr[] = "''''''''''";
char arr1[] = "!!!!!!!!!!";
char arr2[] = "##########";
printf("%st%st%sn",arr,arr1,arr2);
这样,编译器将自己找出长度。
nul字符需要多一个字节的空间:
char arr[11] = "''''''''''";
char arr1[11] = "!!!!!!!!!!";
char arr2[11] = "##########";
printf("%st%st%sn",arr,arr1,arr2);
或者简单地说:
char arr[] = "''''''''''";
char arr1[] = "!!!!!!!!!!";
char arr2[] = "##########";
printf("%st%st%sn",arr,arr1,arr2);
不过,我希望你能得到答案,只是为了更清楚地说明printf()
中的%s
格式说明符,根据C11
标准文件,第7.21.6.1章,
s
如果不存在
l
长度修饰符,则参数应为指向字符类型数组的初始元素的指针。数组中的字符为写至(但不包括)终止的null字符。
这意味着,为%s
提供的参数指针应该是指向char
的指针,末尾有一个null
来标记数组的末尾。因此,空终止的char
数组在C.中被视为字符串
现在,回到你的案子,
char arr[10] = "''''''''''";
一个10元素的char
数组正好有10个初始值设定项。因此,没有空白蚁的空间。当您将该数组的基地址作为printf()
用于%s
的参数时,printf()
不知道在哪里停止,因此读取超出分配的内存,这反过来会调用未定义的行为。
解决方案:
将大小分配留给编译器,这是最好的方法。
char arr[] = "''''''''''";
或者,至少分配足够的内存,以便可以容纳空的terminator。
char arr[11] = "''''''''''"; //10 elements + 1 null
请对arr1
和arr2
也执行相同操作。