[英]Array showing random characters at the end
我想用C上的數組測試一下,因為我剛開始學習這門語言。 這是我的代碼:
#include <stdio.h>
main(){
int i,t;
char orig[5];
for(i=0;i<=4;i++){
orig[i] = '.';
}
printf("%s\n", orig);
}
這是我的輸出:
.....�
就是這樣。 那些神秘人物是什么? 我做錯了什么?
帶有printf()
%s
需要一個指向字符串的指針,即指向空終止字符數組的初始元素的指針。 您的數組未終止。
因此,在搜索終止空字符時, printf()
超出綁定范圍,隨后調用未定義的行為 。
如果要將其用作字符串 ,則必須對數組進行空終止。
引用: C11
,章節§7.21.6.1,( 強調我的 )
s
如果不存在l length修飾符,則參數應該是指向字符類型數組的初始元素的指針。 280)來自數組的字符被寫入(但不包括)終止空字符。 如果指定了精度,則不會寫入多少個字節。 如果未指定精度或大於數組的大小,則數組應包含空字符。
快速解決方案
char orig[6];
。 orig[i] = '\\0';
然后,打印結果。
char orig[5];//creates an array of 5 char. (with indices ranging from 0 to 4)
|?|?|?|0|0|0|0|0|?|?|?|?|
| ^memory you do not own (your mysterious characters)
^start of orig
for(i=0;i<=4;i++){ //attempts to populate array with '.'
orig[i] = '.';
|?|?|?|.|.|.|.|.|?|?|?|?|
| ^memory you do not own (your mysterious characters)
^start of orig
這會導致一個非null終止的char數組,如果在需要C字符串的函數中使用它,它將調用未定義的行為。 C字符串必須包含足夠的空間以允許空終止。 將您的聲明更改為以下內容以適應。
char orig[6];
然后將null終止添加到循環的末尾:
...
for(i=0;i<=4;i++){
orig[i] = '.';
}
orig[i] = 0;
導致:
|?|?|?|.|.|.|.|.|0|?|?|?|
| ^memory you do not own
^start of orig
注意 :因為空終止導致C字符串,所以使用它的函數知道如何解釋其內容(即沒有未定義的行為),並且您的神秘字符被保留。
數組和字符數組之間存在差異。 您可以認為字符數組是數組的一種特殊情況,其中每個元素在C中都是char
類型,並且數組應該以字符null
( ASCII value 0
)結束(終止)。
printf()
%s
格式說明符需要一個指向由null
字符終止的字符數組的指針。 您的數組不會以空值終止,因此, printf
函數超出您指定的5個字符,並打印出第5個字符('。')后出現的垃圾值。
要解決您的問題,您需要靜態分配大小比您要存儲的字符多一個的字符數組。 在您的情況下,大小為6的字符數組將起作用。
#include <stdio.h>
int main(){
int i,t;
char orig[6]; // If you want to store 5 characters, allocate an array of size 6 to store null character at last position.
for (i=0; i<=4; i++) {
orig[i] = '.';
}
orig[5] = '\0';
printf("%s\n", orig);
}
有理由為null字符浪費一個額外的字符空間。 原因是無論何時將任何數組傳遞給函數,只有指向第一個元素的指針才會傳遞給函數(在函數的堆棧中推送)。 這使得函數無法確定數組的結尾(意味着像sizeof
這樣的運算符在函數內部不起作用,而sizeof
將返回機器中指針的大小)。 這就是原因,像memcpy
, memset
的函數會使用一個額外的函數參數來提及數組大小(或者你想要操作的長度)。
但是,使用字符數組,函數可以通過查找特殊字符( null
字符)來確定數組的大小。
您需要在字符串的末尾添加NUL
字符( \\0
)。
#include <stdio.h>
main()
{
int i,t;
char orig[6];
for(i=0;i<=4;i++){
orig[i] = '.';
}
orig[i] = '\0';
printf("%s\n", orig);
}
如果您不知道\\0
是什么,我強烈建議您查看ascii表( https://www.asciitable.com/ )。
祝好運
prinftf
獲取任何內存位置的起始指針,在這種情況下為數組並打印,直到遇到\\0
字符。 這些類型的字符串稱為null
終止字符串。
所以請在末尾添加\\0
並輸入字符直到(數組大小為2),如下所示:
main(){
int i,t;
char orig[5];
for(i=0;i<4;i++){ //less then size of array -1
orig[i] = '.';
}
orig[i] = '\0'
printf("%s\n", orig);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.