[英]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()
将被用于%s
, printf()
不知道在哪里停止,从而读取超出分配的存储器,其依次调用未定义的行为 。
解:
最好将大小分配留给编译器。
char arr[] = "''''''''''";
或者,至少分配足够的内存,以便可以容纳null-termiantor。
char arr[11] = "''''''''''"; //10 elements + 1 null
请对arr1
和arr2
也执行相同的操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.