簡體   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