我在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
以获取“嗨吉姆!”。我确保s1
足够大以包含两个字符串。但是,当我运行它时,它输出“Hi”,所以基本上它不会更新字符串s1
。我不知道为什么:s1
仍然指向s1[0] = 'H'
,并且在concat
运行后,'\0'
中的s1[3]
应该已被替换s1
'\0'
1}}应在s1[7]
处以strcat
终止。
P.S。请注意,与K& R一样,我的{{1}}版本与标准库版本不匹配。特别是,返回值无效。
答案 0 :(得分:1)
在您的代码中,问题是,在到达终止NUL
后,您正在推进指针*s++
,因此,它包含在目标字符串中,使{{1解释为字符串的结尾。根据字符串连接的设计规则,您需要删除[或替换或覆盖]终止printf()
并添加第二个字符串。
为了避免在输出字符串中出现终止NUL
,请不要在指针到达NUL
时递增指针,而是开始从该特定位置本身复制下一个字符串。
检查以下代码。
NUL
答案 1 :(得分:0)
检查以下代码:
void concat(char *s, char *t)
{
while (*s != '\0')
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;
}
答案 2 :(得分:0)
感谢@MOehm,我通过简单地插入s--
来修复代码,以补偿过去的null终结符:
void concat(char *s, char *t)
{
while (*s++)
;
s--;
while (*s++ = *t++)
;
}