strcat_s和char指针新手问题

时间:2017-05-17 14:26:23

标签: c pointers char strcat-s

我正在使用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而不是数组的指针来使其工作?

非常感谢任何其他解决方案或提示。

提前谢谢。

2 个答案:

答案 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; *strstr第一个位置的单个字符,您的表达式将字符串文字"Ciao "指针转换为字符序列)转换为一些单个字符(在这种情况下为T;令人惊讶,不是吗?)。人们需要使用strcpy代替。相比之下,数组(如char buffer[20] = "Ciao ")可以正常工作,因为这个(特殊)情况不是赋值,而是数组的初始化。

您的代码sizeof(str1)为您提供指针值的大小,可能是48,与内容或内存块的实际大小无关保留。一个人应该使用strlen代替。

关于strcat_s,应该考虑到它并非在所有平台上都可用,并且您必须意识到它的特殊行为。例如,如果您调用的strcat_s(somebuffer, 3, "somestrlongerthan3")超过了提供的3的最大长度,则somebuffer将是一个“空”字符串(即第一个字符将设置为{{1} }}

我建议改用\0strncat。请参阅以下变体:

snprintf