使用 strncpy 和 strncat 的奇怪输出
weird output using strncpy and strncat
我想编写一个程序获取字符串的前半部分 'ch1' 并将其放入字符串 'ch3' 然后获取另一个字符串的前半部分 'ch2' 并连接它在 'ch3' "puts is in the end of ch3" 中但是当我执行它时,它给了我奇怪的 ch3 输出..
例如:
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[]
初始化为全零:char ch3[200] = { 0 };
或者您可以在将 ch1
的前半部分复制到 ch3
之后手动将空终止符(字符 '[=13=]'
)放置在 ch3
上:
strncpy(ch3, ch1, strlen(ch1) / 2);
ch3[strlen(ch1)/2] = '[=10=]';
strncat(ch3, ch2, strlen(ch2) / 2);
这是必需的,因为 C 中的字符串需要以 null 结尾(这意味着您需要在字符串的最后一个字符后添加一个 0 值来标记字符串的结尾)。如果 ct
的字符少于 n
(不是你的情况),函数 strncpy(s, ct, n)
仅用零填充,因此,如果你不手动添加空字符,strncat
会认为 ch3
更长。它将在 ch3
开始后搜索内存中的第一个零,并且只有在那里它才会连接你想要的内容。这就是那些奇怪的字符的来源。
我想编写一个程序获取字符串的前半部分 'ch1' 并将其放入字符串 'ch3' 然后获取另一个字符串的前半部分 'ch2' 并连接它在 'ch3' "puts is in the end of ch3" 中但是当我执行它时,它给了我奇怪的 ch3 输出.. 例如:
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[]
初始化为全零:char ch3[200] = { 0 };
或者您可以在将 ch1
的前半部分复制到 ch3
之后手动将空终止符(字符 '[=13=]'
)放置在 ch3
上:
strncpy(ch3, ch1, strlen(ch1) / 2);
ch3[strlen(ch1)/2] = '[=10=]';
strncat(ch3, ch2, strlen(ch2) / 2);
这是必需的,因为 C 中的字符串需要以 null 结尾(这意味着您需要在字符串的最后一个字符后添加一个 0 值来标记字符串的结尾)。如果 ct
的字符少于 n
(不是你的情况),函数 strncpy(s, ct, n)
仅用零填充,因此,如果你不手动添加空字符,strncat
会认为 ch3
更长。它将在 ch3
开始后搜索内存中的第一个零,并且只有在那里它才会连接你想要的内容。这就是那些奇怪的字符的来源。