在C中,函数strcat
不会创建包含连接字符串的新字符数组。它将第二个字符串中的字符附加到第一个字符数组的第一个字符串,前提是它具有足够的元素来存储新字符。否则,函数将尝试覆盖超出字符数组的内存,导致未定义的行为。
所以在第一程序的有效使用的功能可以看下面的方式
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[]) {
char s1[11] = "12345";
char s2[] = "abcde";
strcat(s1, s2);
puts(s1);
puts(s2);
return 0;
}
在这个程序中的字符数组被声明为具有11个元素。因此它能够容纳附加的字符串"abcde"
。
在第二个程序中,尝试修改指针s1
指向的字符串文字。 C和C++中的字符串文字是不可变的。任何尝试更改字符串文字都会导致未定义的行为,即使在与C++相反的C语言中,字符串文字也具有非常量字符数组的类型。
从C标准(6.4.5字符串文本)
7这些阵列是否是不同的条件是它们的 元素具有适当的值是不确定的。 如果程序尝试 修改这样一个数组,行为是未定义的。
因此,在第二个程序中,您需要再次使用带有足够元素的字符数组。例如
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[]) {
char s1[11] = "12345";
char* s2 = "abcde";
strcat(s1, s2);
puts(s1);
puts(s2);
return 0;
}
或者,如果编译器支持他们或动态分配一个数组,你可以使用一个可变长度数组(VLA)。例如
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[]) {
char *s1 = "12345";
char* s2 = "abcde";
char s3[strlen(s1) + strlen(s2) + 1];
strcpy(s3, s1);
strcat(s3, s2);
puts(s1);
puts(s2);
puts(s3);
return 0;
}
或者
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[]) {
char *s1 = "12345";
char* s2 = "abcde";
char *s3 = malloc(strlen(s1) + strlen(s2) + 1);
if (s3 != NULL)
{
strcpy(s3, s1);
strcat(s3, s2);
puts(s1);
puts(s2);
puts(s3);
}
free(s3);
return 0;
}
庆典 - >男人的strcat – Jonas
你似乎相信它分配它所需要的内存。那么,它不会。 – Siguza
这两种都是未定义的行为。 – BLUEPIXY