找到字符串的结尾:* s ++ VS * s然后是s ++

时间:2010-02-01 03:04:27

标签: c pointers postfix-operator

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

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

while (*s++)
    ;

但是,该方法不起作用。传递给它的字符串未正确复制。具体来说,我试图将“abc”复制到一个持有“\ 0”的char []变量。

从阅读C& R书籍看起来应该可行。紧凑的表格应采取以下步骤。

  1. * s与'\ 0'
  2. 进行比较
  3. s指向下一个地址
  4. 那为什么不起作用?我在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;
    }
    

    提前致谢。

5 个答案:

答案 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中,指向未分配内存的指针在技术上是非法的,即使您没有取消引用它。所以一定要修复你的程序,即使它似乎有效。