【问题标题】:weird output using strncpy and strncat使用 strncpy 和 strncat 的奇怪输出
【发布时间】:2017-03-04 13:56:32
【问题描述】:

我想编写一个程序,它获取字符串 'ch1' 的前半部分并将其放入字符串 'ch3' 然后获取另一个字符串 'ch2' 的前半部分并将其连接到 'ch3' “puts is在 ch3 的末尾”但是当我执行它时,它给了我奇怪的 ch3 输出 .. 例如:

ch1 ="123"
ch2 ="azertyuiop"

结果: ch3 ="1azert"

这是我的代码:

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;
}

如果有人帮助我,我将不胜感激。 谢谢

【问题讨论】:

  • man strncpy: [...] 警告:如果 src 的前 n 个字节中没有空字节,则放在 dest 中的字符串不会以空字符结尾。我>
  • 能否请您多解释一下.. 抱歉,我是新手
  • 我确实用 scanf("%s",);问题依然存在
  • @SamiBenAbderazak scanf %sgets 有完全相同的问题。不要使用它。

标签: c string strncpy string.h


【解决方案1】:

您可以将ch3[] 初始化为全零:char ch3[200] = { 0 }; 或者您可以在将ch1 的前半部分复制到ch3 后手动将空终止符(字符'\0')放置到它:

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

这是必需的,因为 C 中的字符串需要以空值结尾(这意味着您需要在字符串的最后一个字符之后使用 0 值来标记字符串的结尾)。如果ct 的字符少于n(不是您的情况),函数strncpy(s, ct, n) 只会用零填充,因此,如果您不手动添加空字符,strncat 会认为ch3 很多更长。它将在ch3 开始后搜索内存中的第一个零,并且只有在那里它才会连接您想要的内容。这就是那些奇怪的字符的来源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-03
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    相关资源
    最近更新 更多