2

我正在编写一个简单的字符串连接程序。

该程序按照我发布的方式运行。但是,我首先使用以下代码编写它来查找字符串的结尾:

while (*s++)
    ;

然而,这种方法并没有奏效。我传递给它的字符串没有正确复制。具体来说,我尝试将“abc”复制到保存“\0”的 char[] 变量。

从阅读 C K&R 的书来看,它看起来应该可以工作。该紧凑形式应采取以下步骤。

  1. *s 与 '\0' 比较
  2. s 指向下一个地址

那么为什么它不起作用呢?我在 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;
}

提前致谢。

4

5 回答 5

15

结束后while (*s++);s指向空终止符后的字符。在下面的代码中考虑到这一点。

于 2010-02-01T03:07:44.300 回答
6

问题是

 while (*s++)
     ;

始终递增 s,即使 s 为零(*s 为假)

 while (*s)
    s++;

仅在 *s 非零时增加 s

所以第一个将 s 指向第一个 \0之后的第一个字符,而第二个将 s 指向第一个 \0。

于 2010-02-01T03:12:27.550 回答
4

有区别。在第一种情况下,s 将指向 '\0' 之后的位置,而第二种情况则在 '\0' 处停止。

于 2010-02-01T03:08:41.507 回答
2

正如 John Knoeller 所说,在运行结束时,它将指向NULL之后的位置。但是没有必要为正确的解决方案牺牲性能..自己看看:

while (*s++); --s;

应该做的伎俩。

于 2010-02-01T05:10:17.827 回答
0

此外,请注意,在 C 语言中,指向未分配内存的指针在技术上是非法的,即使您不取消引用它也是如此。所以一定要修复你的程序,即使它看起来可以工作。

于 2010-02-01T05:04:47.527 回答