strcat & 覆盖

strcat & Overwrite

我在一些网站上阅读了documentation strcat() C 库函数。

我也看过这里:Does strcat() overwrite or move the null?

不过,还有一个问题——可以用strcat()函数覆盖destionation字符串中的字符吗(假设dest string有足够的space作为source string,所以不会有错误)?

我运行下面的代码,发现它没有能力覆盖目标字符串的字符...

char dest[20] = "Hello World";
char src[] = "char";
strcat(dest+1, src);
printf("dest: %s", dest);

假设目标是使目标字符串包含:“Hchar World!”

(我知道 strcat() 也会将 NULL 字符('\0') 复制到 dest 字符串,所以如果调用 printf() 函数,它应该打印 Hchar,因为我错误地认为会发生.. .).

这可能是用 strcat() 完成的任务吗?如果不是,strcpy() 是问题的答案吗?

如果字符串中间有'\0'(NULL字符)的赋值,例如strcat()总是会把第一个'\0 ' (NULL character) 它符合吗?我的意思是,如果我有:

 char str[] = "Hello";
 str[2]= 0;
 strcat(str, "ab");

我只是想确定一下,澄清一下误会。我会很高兴阅读解释。

strcat 将在 dst 的末尾 写入 src 字符串 。 如果你想用 strcat 覆盖 dst,你首先需要在你想覆盖它的地方做 dst“结束”。

看看这个代码示例:

#include <stdio.h>
#include <string.h>

int main()
{
    char dst[20] = "Hello world";
    char src[] = "char";
    
    dst[1] = '[=10=]';
    strcat(dst, src);
    printf("%s\n", dst);
    return (0);
}

然而,这不是strcat的目的,正如评论中所说,这里使用strcpy会更合适。

#include <stdio.h>
#include <string.h>

int main()
{
    char dst[20] = "Hello world";
    char src[] = "char";
    
    strcpy(dst + 1, src);
    printf("%s\n", dst);
    return (0);
}

如评论中所述,strcat 函数将始终(尝试)附加 作为其第二个参数给出的字符串(传统上称为 src ) 作为第一个给定的 (dest);如果任一字符串不是空终止的或者目标缓冲区不够大,它将产生未定义的行为。

cppreference site 提供了比您链接的网站更好的文档(针对 C 和 C++)。来自该站点的 strcat 页面:

(1) … The character src[0] replaces the null terminator at the end of dest. The resulting byte string is null-terminated.

并且:

Notes

Because strcat needs to seek to the end of dest on each call, it is inefficient to concatenate many strings into one using strcat.

因此,在您显示的代码中,调用 strcat(dest+1, src); 与调用 strcat(dest, src); 具有相同的效果。但是,调用 strcpy(dest+1, src); 将产生您想要的结果(打印 Hchar)。