c-特殊字符字符串



我需要使用特殊字符字符串,如:!,",#,~

如果我这样做:

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()不知道在哪里停止,因此读取超出分配的内存,这反过来会调用未定义的行为。

解决方案:

  1. 将大小分配留给编译器,这是最好的方法。

    char arr[]  = "''''''''''";
    
  2. 或者,至少分配足够的内存,以便可以容纳空的terminator。

    char arr[11]  = "''''''''''";  //10 elements + 1 null
    

请对arr1arr2也执行相同操作。

最新更新