2017-03-04 5 views
-3

文字列 'ch1'の最初の半分を取得し、それを文字列 'ch3'に配置し、別の文字列 'ch2'の最初の半分を取得して連結するプログラムを作成したい例えば ​​'CH3' "プットがCH3の最後にある" しかし、私はそれを実行するとき、それは私に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; 
} 

誰かが私を助けてくれたらと思います。 ありがとうございますが、どちらかすべてゼロであることをch3[]を初期化することができます

+2

'man strncpy':* [...]警告:srcの最初のnバイトの間にヌルバイトがない場合、 destに置かれた文字列はヌルで終了しません。* – EOF

+0

もう少し.. 私はこれに初めてです。 –

+2

'gets'を使わないでください:http://stackoverflow.com/q/1694036/4996248 –

答えて

1

char ch3[200] = { 0 }; それとも、手動でそれにch1の前半をコピーした後ch3上のNULL終止符(文字'\0')を配置することができます

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

これは、Cの文字列がヌル文字で終了する必要があるため(文字列の最後を表す文字列の最後の文字の後に値0が必要なため)必要です。関数strncpy(s, ct, n)は、ctの文字数がn(あなたのケースではない)未満の場合はゼロになります。したがって、ヌル文字を手動で追加しないと、strncatch3がはるかに長いと考えられます。それはch3の開始後にメモリ内の最初のゼロを検索し、そこにのみあなたが望むものを連結します。その奇妙なキャラクターが生まれる場所です。