我正在使用visual studio进行简单的练习。 使用strcat_s函数我通过以下代码收到违规异常:
char *str1;
str1 = (char *)malloc(20);
*str1 = "Ciao ";
char *str2 = "Marco";
strcat_s(str1, sizeof(str1), str2);
printf("%s", str1);
现在,如果我使用固定大小的预定义数组,strcat_s可以完美运行。 如何使用指向char而不是数组的指针来使其工作?
非常感谢任何其他解决方案或提示。
提前谢谢。
答案 0 :(得分:1)
您必须先将字符串复制到已分配的内存中。如果您想知道字符串的长度,请使用strlen()
。 sizeof()
以字节为单位返回数据类型的大小。在你的情况下,它是一个指针(32位为4字节,64位机器为8字节)。
以下代码应该可以正常工作:
char *str1 = (char *)malloc(20);
strcpy(str1,"Ciao ");
char *str2 = (char *)malloc(20);
strcpy(str2,"Marco ");
strcat(str1, str2);
printf("%s", str1);
答案 1 :(得分:0)
您的代码存在一些问题,strcat_s
上有一些常规说明。
您的代码str1 = (char *)malloc(20); *str1 = "Ciao "
不会复制Ciao
; *str
是str
第一个位置的单个字符,您的表达式将字符串文字"Ciao "
(指针转换为字符序列)转换为一些单个字符(在这种情况下为T
;令人惊讶,不是吗?)。人们需要使用strcpy
代替。相比之下,数组(如char buffer[20] = "Ciao "
)可以正常工作,因为这个(特殊)情况不是赋值,而是数组的初始化。
您的代码sizeof(str1)
为您提供指针值的大小,可能是4
或8
,与内容或内存块的实际大小无关保留。一个人应该使用strlen
代替。
关于strcat_s
,应该考虑到它并非在所有平台上都可用,并且您必须意识到它的特殊行为。例如,如果您调用的strcat_s(somebuffer, 3, "somestrlongerthan3")
超过了提供的3
的最大长度,则somebuffer
将是一个“空”字符串(即第一个字符将设置为{{1} }}
我建议改用\0
或strncat
。请参阅以下变体:
snprintf