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
)。
我在一些网站上阅读了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 ofdest
. The resulting byte string is null-terminated.
并且:
Notes
Because
strcat
needs to seek to the end ofdest
on each call, it is inefficient to concatenate many strings into one usingstrcat
.
因此,在您显示的代码中,调用 strcat(dest+1, src);
与调用 strcat(dest, src);
具有相同的效果。但是,调用 strcpy(dest+1, src);
将产生您想要的结果(打印 Hchar
)。