2010-02-01 60 views
2

我在写一个简单的字符串连接程序。查找字符串的结尾:* s ++ VS * s then s ++

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

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

在此先感谢。

+3

供将来参考“没有用”。 *不是*失败模式的有用描述。结果与预期结果有什么不同? – dmckee 2010-02-01 04:45:34

+0

不相关的笔记,每当做非明显的东西,使用括号。你可能还记得现在++在运算符优先级表中位于*之上,但是经过7个小时的编码之后,你真的开始怀疑是否* s ++;意思是*(s ++);或(* s)++; – 2010-02-01 08:18:53

+0

只是一个附注:为该功能取另一个名称。这不是strncat的工作原理。 – quinmars 2010-02-01 12:34:37

回答

14

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

4

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

6

问题是

while (*s++) 
    ; 

始终增量S,即使当s是零(* s为假)

while (*s) 
    s++; 

只有当* s为非零

所以值被增加了第一个将留下第一个字符第一个\ 0,而第二个将留下s指向第一个\ 0。

0

另外说了什么,请注意,在C语言中,指向未分配内存的指针在技术上是非法的,即使您不取消引用它。所以一定要修复你的程序,即使它看起来有效。

+0

指定数组后特定允许指向的第一个位置(以便与数组中的指针进行比较)因此这不是问题 – 2010-02-01 14:31:00

+0

在数组末尾寻址一个项是标准明确定义的特例。这是一个包含关于它的讨论的主题:http://stackoverflow.com/questions/988158/take-the-address-of-a-one-past-the-end-array-element-via-subscript-legal- by-the – indiv 2010-02-01 14:36:13

+0

@jk:好点。 – 2010-02-01 14:36:39

2

正如约翰Knoeller说,在运行它会旨意空后指向位置结束。 无需牺牲性能为正确的解决方案..看看自己:

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

应该做的伎俩。

+1

你是不是故意说'while(* s ++); --s;'? – 2010-02-01 13:40:51

+0

哎呀!感谢您的支持......当我在赶时间的时候,我正在出门工作。 – 2010-02-01 14:18:38

相关问题