2016-09-28 149 views
0

我想連接從歌曲閃爍閃爍的隨機數行。發送出去之前進入緩衝區,因爲我需要計算緩衝區的大小。C - 如何將一個字符串數組連接到一個緩衝區?

我的代碼:

char temp_buffer[10000]; 
char lyrics_buffer[10000]; 
char *twinkle[20]; 
int arr_num; 
int i; 

twinkle[0] = "Twinkle, twinkle, little star,"; 
twinkle[1] = "How I wonder what you are!"; 
twinkle[2] = "Up above the world so high,"; 
twinkle[3] = "Like a diamond in the sky."; 
twinkle[4] = "When the blazing sun is gone,"; 
twinkle[5] = "When he nothing shines upon,"; 

srand(time(NULL)); 
arr_num = rand() % 5; 

for (i=0; i<arr_num; i++); 
{ 
    sprintf(temp_buffer, "%s\n", twinkle[i]); 
    strcat(lyrics_buffer, temp_buffer); 
} 

printf("%s%d\n", lyrics_buffer, arr_num); 

我當前的代碼只打印1線,甚至當我得到一個數字大於0

+3

你是否在任何地方初始化'lyrics_buffer'?如果你不這樣做並且它是一個局部變量,那麼在'strcat'中使用它會導致*未定義的行爲*。 –

+0

@JoachimPileborg是它的一個局部變量。我是否也應該在主體中聲明它? –

+5

'for(i = 0; i '%6' – BLUEPIXY

回答

2

有兩個問題:第一個是由BLUEPIXY發現,那就是你的循環永遠不會做什麼,你認爲它。如果您只是使用調試器來遍歷代碼(請在將來首先執行該操作),那麼您會很容易發現非常容易

的第二個問題是,非靜態局部變量(內容如您lyrics_buffer不確定。使用這樣的變量不用初始化導致未定義行爲。之所以出現這種情況是因爲strcat函數查找結束如果目標字符串的內容不確定,它看起來是隨機的,並且終止符可能不在數組中的任何位置。

要初始化數組你只需做例如

char lyrics_buffer[10000] = { 0 }; 

這將使編譯器初始化爲零,這就是'\0'

temp_buffer不需要此初始化,因爲sprintf無條件地開始在第一個位置寫入,它不會以任何方式檢查內容。換句話說,它確實初始化緩衝區。

+0

謝謝你的明確答案。不幸的是我沒有使用IDE。我使用的是linux虛擬機,我不是Linux用戶,因此我不確定如何在Linux控制檯中使用調試器。 –

+0

無論如何我會初始化temp_buffer會有什麼後果嗎?也許我會在未來初始化所有陣列以保證安全 –

+0

@nanjeroechizen沒有問題。無論如何,Linux世界中確實只有一個調試器,它與流行的Linux IDE':GDB'使用的是相同的。嘗試運行命令'gdb'或安裝'gdb'包。 –

0

更新爲0

初始化緩衝後,每次打印後,緩衝區地址
char temp_buffer[10000] = {0}; 
for (i=0; i<arr_num; i++) //removed semicolon from here 
{ 
    sprintf(temp_buffer + strlen(temp_buffer), "%s\n", twinkle[i]); 
} 

temp_buffer應該包含最終輸出。確保你有足夠的緩衝區大小

你不需要strcat

+0

@aragaer究竟如何? – PnotNP

相關問題