通过指针连接两个字符串不起作用

Concat two strings through pointers not working

我创建了一个函数,将字符串 t 连接到字符串 s 的末尾,对于我的练习,我必须为此使用指针,所以我这样做了,但它不起作用:

#include <stdio.h>

void strcat(char *s, char *t)
{
    while (*s++);

    for (*s = *t; *s = *t; s++, t++);
}

int main()
{
    char c[100] = "hello";
    char *w = " world\n";
    
    strcat(c, w);

    printf(c);
    
    return 0;
}

c 的输出总是 return“你好”而不是“你好world\n”

这个函数内的while循环

while (*s++);

不正确。在 while 循环之后,由于后缀递增运算符,指针 s 指向终止零字符 '[=14=]' 之后。

函数可以通过以下方式声明和定义

char * strcat(char *s, const char *t)
{
    char *p = s;

    while( *p ) ++p;

    while ( ( *p++ = *t++ ) != '[=11=]' );

    return s;
}

您还应该重命名该函数,因为 C 中已经有标准的字符串函数 strcat

这是一个演示程序。

#include <stdio.h>

char *string_cat( char *s, const char *t )
{
    char *p = s;

    while (*p) ++p;

    while (( *p++ = *t++ ) != '[=12=]');

    return s;
}

int main( void )
{
    char c[100] = "hello";
    const char *w = " world";

    puts( string_cat( c, w ) );
}

程序输出为

hello world

另外 好的回答:

Local void strcat(char *s, char *t) 假定 s, t 引用的字符串在内存中不重叠。考虑下面的无限循环 if s == t.

char *p = s;
while (*p) p++;
while ((*p++ = *t++ ) != 0);

标准 C 库有 char *strcat(char * restrict s1, const char * restrict s2);restrict 假定不重叠并发出可能更好的代码>否则会导致 未定义的行为 (UB)。 OP的代码也应该使用restrict.

但是我们想要做什么 strcat() 并应对重叠?

// Allow strings refenced by s,t to overlap.
char *my_strcat(char *s1, const char *s2) {
  size_t s1len = strlen(s1);
  size_t s2siz = strlen(s2) + 1u;
  memmove(s1 + s1len, s2, s2siz);
  return s1;
}

int main(void) {
  char c[100] = "hello";
  const char *w = c; //" world";
  puts(my_strcat(c, w));
}

输出

hellohello

为了处理重叠,需要额外的工作来确定 s2 的大小。