我正在编写一个简单的字符串连接程序。
该程序按我发布的方式工作。但是,我首先使用以下代码编写它来查找字符串的结尾:
while (*s++)
;
但是,该方法不起作用。传递给它的字符串未正确复制。具体来说,我试图将“abc”复制到一个持有“\ 0”的char []变量。
从阅读C& R书籍看起来应该可行。紧凑的表格应采取以下步骤。
那为什么不起作用?我在Debian上用gcc编译。
我发现这个版本确实有效:
strncat(char *s, const char *t, int n)
{
char *s_start = s;
while (*s)
s++;
for ( ; n > 0 && *t; n--, s++, t++)
*s = *t;
*(s++) = '\0';
return s_start;
}
提前致谢。
答案 0 :(得分:15)
while (*s++);
结束后,s
指向空终结符后的字符。请在后面的代码中考虑到这一点。
答案 1 :(得分:6)
问题在于
while (*s++)
;
总是递增s,即使s为零(* s为假)
while (*s)
s++;
仅在* s非零
时递增s所以第一个将指向第一个\ 0之后的第一个字符,而第二个将指向第一个\ 0。
答案 2 :(得分:4)
有区别。在第一种情况下,s将指向'\ 0'之后的位置,而第二种情况则指向'\ 0'之后的位置。
答案 3 :(得分:2)
正如John Knoeller所说,在运行结束时,它将指向之后的位置。 但是没有必要为正确的解决方案牺牲性能。看看你自己:
while (*s++); --s;
应该做的伎俩。
答案 4 :(得分:0)
除此之外,请注意,在C中,指向未分配内存的指针在技术上是非法的,即使您没有取消引用它。所以一定要修复你的程序,即使它似乎有效。