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

时间:2014-11-17 07:58:28

标签: c pointers while-loop strcat

我在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}}版本与标准库版本不匹配。特别是,返回值无效。

3 个答案:

答案 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++)
        ;
}