2014-02-24 155 views
0

你好,我無法弄清楚爲什麼a)這個代碼錯誤在最後的副本和b)在調試器顯示圖片[0]包含0到4,然後包含1到4(見圖片1將字符串複製到一個字符串數組

char picture[5][5]; 
strcpy(picture[0], "#####"); 
strcpy(picture[1], "#####"); 
strcpy(picture[2], "#####"); 
strcpy(picture[3], "#####"); 
strcpy(picture[4], "#####"); 

當Xcode的錯誤它顯示下列

enter image description here

回答

1

你忘了,你需要一個空字節終止字符串。 (事實上​​,你最後strcpy()寫入陣列的界限之外,調用未定義的行爲)使用:

char picture[5][6] = { "#####", "#####", "#####", "#####", "#####", }; 

這節省了strcpy()呼叫過於。


我說:

編譯器,如果你改變了6比5,但我認爲這是必需的,以允許初始化(即使它不得不放棄終止很可能會產生警告空字節)。但這是一個警告,你想要修復;它顯示出一個真正的問題。

事實上,GCC 4.8.2甚至沒有在相當嚴格的編譯選項下發出警告。

彙編:

gcc -O3 -g -std=c11 -Wall -Wextra -Werror ols.c -o ols 

代碼:

#include <stdio.h> 

static char picture1[5][5] = { "#####", "#####", "#####", "#####", "#####", }; 
static char picture2[5][6] = { "#####", "#####", "#####", "#####", "#####", }; 

int main(void) 
{ 
    for (int i = 0; i < 5; i++) 
     printf("%s\n", picture1[i]); 
    for (int i = 0; i < 5; i++) 
     printf("%s\n", picture2[i]); 
    return 0; 
} 

輸出:

######################### 
#################### 
############### 
########## 
##### 
##### 
##### 
##### 
##### 
##### 
+0

謝謝。我以爲我嘗試了你之前給過的語法,但它不起作用(儘管它可能也是一個空字節問題)。 – Zimm3r

+0

如果將6更改爲5,編譯器可能會生成警告,但我認爲需要允許初始化器(即使它將刪除終止的空字節)。但這是一個警告,你想要修復;它顯示出一個真正的問題。 –

+0

雅我後來修復它,但我真的沒有使用它們,因爲它在一個永遠不會結束的for循環中。謝謝 – Zimm3r

3

C串與字符\0結束。所以,你必須通過聲明數組爲他們預留空間:

char picture[5][6]; 
2

當你聲明char str[n]這意味着n-1字符是保留給你。而最後一個是'\ 0'字符(終止符)。如果覆蓋'\ 0'字符,它會繼續打印直到在內存中找到'\ 0'。

當你正在使用從strings.h了一項功能,修改char picture[5][5];char picture[5][6];

0

,一定要照顧「\ 0」,否則你將永遠在字符串的結尾得到意想不到的輸出(尤其是當用%s打印時)。編譯器不會給出任何警告,因爲它不會發現任何錯誤。當您使用%s進行打印時,編譯器將查找「\ 0」,並在運行程序之前繼續打印。實際上,當你正在使用strncpy時,如果數組大小爲9,而你只使用5,則其餘4將存儲在它們中的null

相關問題