2017-03-04 111 views
-3

我想編寫一個程序,獲取字符串'ch1'的前半部分並將其放入字符串'ch3'中,然後獲取另一個字符串'ch2'的前半部分並將其連接'CH3' 「把在CH 3的端部」,但是當我執行它,它給我要CH3怪異輸出.. 例如:使用strncpy和strncat的奇怪輸出

ch1 ="123" 
ch2 ="azertyuiop" 

結果: CH3 =「1 < 3rdweirdletter> azert 「

這是我的代碼:

int main() 
{ 
char ch1[200],ch2[200],ch3[200]; 

puts("give 'ch1' "); 
gets(ch1); 
puts("give 'ch2' "); 
gets(ch2); 

strncpy(ch3,ch1, strlen(ch1)/2); 
strncat(ch3,ch2, strlen(ch2)/2); 

printf("a half \"%s\" + a half \"%s\" gives \"%s\"",ch1,ch2,ch3); 

return 0; 
} 

如果有人幫助我,我將不勝感激。 感謝

+2

'man strncpy':* [...]警告:如果在src的前n個字節中沒有空字節,則 放置在dest中的字符串不會以null結尾* – EOF

+0

請您解釋一下更多.. 對不起,我對此感興趣 –

+2

請勿使用'gets':http://stackoverflow.com/q/1694036/4996248 –

回答

1

您可以初始化ch3[]是所有零:char ch3[200] = { 0 }; 或者你也可以手動將上ch3空終止(字符'\0')的ch1上半年複製到它後:

strncpy(ch3, ch1, strlen(ch1)/2); 
ch3[strlen(ch1)/2] = '\0'; 
strncat(ch3, ch2, strlen(ch2)/2); 

這是必需的,因爲C中的字符串需要以null結尾(意味着在字符串的最後一個字符後面需要一個值0來標記字符串的結尾)。如果ct的字符數少於n(這不是你的情況),則函數strncpy(s, ct, n)只能填充零,因此,如果不手動添加空字符,strncat會認爲ch3會長得多。它會在ch3開始之後搜索內存中的第一個零,並且只會在那裏連接你想要的內容。這就是那些怪異角色的來源。