【发布时间】:2014-11-17 07:58:27
【问题描述】:
我正在按照 K&R 用 C 语言编写自己的 strcat 版本。这是我的代码:
#define MAXVALUE 1000
void concat(char *s, char *t)
{
while (*s++)
;
while (*s++ = *t++)
;
}
/* test */
int main()
{
char s1[MAXVALUE];
char s2[] = "Jim!";
s1[0] = 'H', s1[1] = 'i', s1[2] = ' ';
s1[3] = '\0';
concat(s1, s2);
printf("%s\n", s1);
return 0;
}
这个想法是将s2 复制到s1 以获得“Hi Jim!”。我确保s1 足够大以包含两个字符串。但是,当我运行它时,它会输出“Hi”,所以基本上它不会更新字符串s1。我不知道为什么:s1 仍然指向s1[0] = 'H',并且在运行concat 之后,s1[3] 中的'\0' 应该已经被替换,s1 应该在@ 处以'\0' 终止987654334@.
附:请注意,在 K&R 中,我的 strcat 版本与标准库之一不匹配。特别是返回值是void。
【问题讨论】:
-
您的第一个
while超过了空终止符。改用while (*s) s++;,所以*s是循环后的空字符。 -
@Himanshu 不会迭代两次吗?一次在一段时间内,一次在括号内。我认为他写它的方式是正确的。首先它迭代直到
*s结束然后将在*s和*t的末尾连接并递增到下一个元素。 @MOeehm 发表的评论是正确的。 -
@MOehm 是的,你是对的。在 while 之间插入
s--可以解决问题。感谢您的帮助,这是我犯的一个愚蠢的错误。
标签: c pointers while-loop strcat