2017-03-04 40 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开始之后搜索内存中的第一个零,并且只会在那里连接你想要的内容。这就是那些怪异角色的来源。