gpt4 book ai didi

c - 将指针传递给 strcat 不会更新字符串

转载 作者:行者123 更新时间:2023-11-30 15:27:28 25 4
gpt4 key购买 nike

我正在按照 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' 终止s1[7]

附注请注意,与 K&R 中一样,我的 strcat 版本与标准库版本不匹配。特别是,返回值为void。

最佳答案

在您的代码中,问题是,在到达终止 NUL 后,您正在推进指针 *s++,因此,它包含在目标字符串中,使 printf() 解释为字符串结尾。根据字符串连接的设计规则,您需要删除[或替换或覆盖]终止的NUL并添加第二个字符串。

为了避免在输出字符串中出现终止 NUL,请不要在指针到达 NUL 时递增指针,而是开始从该特定位置本身复制下一个字符串.

检查下面的代码。

#include <stdio.h>
#include <stdlib.h>

#define MAXVALUE 1000

void concat(char *s, char *t)
{
while (*s) s++; //after NUL, do not increment, move on to copying
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;
}

关于c - 将指针传递给 strcat 不会更新字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26967982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com