[英]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.