繁体   English   中英

特殊字符字符串

[英]String of special characters

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

如果我做 :

char arr[10]  = "''''''''''";
char arr1[10] = "!!!!!!!!!!";
char arr2[10] = "##########";
printf("%s\t%s\t%s\n",arr,arr1,arr2);

然后printf打印字符串和一些垃圾。

我要去哪里错了?

字符数组(也称为C字符串)以null终止,因此您需要在数组中有一个额外的索引来存储null字符。 如果您需要一个包含10个字符的字符串,则需要创建一个可以存储11个字符的字符串(空字符'\\0'的额外字符)

因此,将您的代码更改为

char arr[11]  = "''''''''''";
char arr1[11] = "!!!!!!!!!!";
char arr2[11] = "##########";
printf("%s\t%s\t%s\n",arr,arr1,arr2);

甚至更好,如@TheParamagneticCroissant所建议,您可以

char arr[]  = "''''''''''";
char arr1[] = "!!!!!!!!!!";
char arr2[] = "##########";
printf("%s\t%s\t%s\n",arr,arr1,arr2);

这样,编译器将自行找出长度。

nul字符还需要一个字节空间:

char arr[11]  = "''''''''''";
char arr1[11] = "!!!!!!!!!!";
char arr2[11] = "##########";
printf("%s\t%s\t%s\n",arr,arr1,arr2);

或者简单地:

char arr[]  = "''''''''''";
char arr1[] = "!!!!!!!!!!";
char arr2[] = "##########";
printf("%s\t%s\t%s\n",arr,arr1,arr2);

不过,我希望您能得到答案,只是为了进一步说明一下,对于printf() %s格式说明符,按照C11标准文档§7.21.6.1,

s

如果没有l长度修饰符,则参数应为指向字符类型数组的初始元素的指针。 数组中的字符被写入(但不包括)终止空字符。

这意味着,为%s提供的参数指针应该是char的指针,结尾必须有一个null来标记array-of 因此,以空终止的char数组在C中被视为字符串

现在,回到您的情况,

char arr[10]  = "''''''''''";

您有一个10元素的char数组正好有10个初始化程序。 因此,没有空值修饰符的空间。 当您sypplu此数组的基地址作为一个参数printf()将被用于%sprintf()不知道在哪里停止,从而读取超出分配的存储器,其依次调用未定义的行为

解:

  1. 最好将大小分配留给编译器。

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

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

请对arr1arr2也执行相同的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM