您的代码存在一些问题,并且有一些关于strcat_s
.
您的代码str1 = (char *)malloc(20); *str1 = "Ciao "
不会复制Ciao
;*str
是 的第一个位置的单个字符str
,并且您的表达式将字符串文字"Ciao "
(它是指向字符序列的指针)转换为某个单个字符(T
在这种情况下;令人惊讶,不是吗?)。一个人需要strcpy
改用。相比之下,像 一样的数组是char buffer[20] = "Ciao "
有效的,因为这种(特殊)情况不是赋值,而是数组的初始化器。
您的代码sizeof(str1)
为您提供了指针值的大小,它可能是4
or 8
,与内容的实际大小或保留的内存块无关。应该strlen
改用。
关于strcat_s
,应该考虑到它并非在所有平台上都可用,并且您必须了解它的特殊行为。例如,如果您调用strcat_s(somebuffer, 3, "somestrlongerthan3")
超过所提供的最大长度的3
,somebuffer
将是一个“空”字符串(即第一个字符将设置为\0
.
我建议使用strncat
orsnprintf
代替。请参阅以下变体:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main () {
char c = "Ciao "; // Gives a compiler warning and yields 'T'
#define maxlen 20
// Variant 1: start with initialized buffer, yet no "pointer" and dynamic allocation
char resultBuffer[maxlen] = "Ciao ";
size_t charactersRemaining = maxlen-strlen(resultBuffer)-1;
strncat(resultBuffer, "Marco", charactersRemaining);
// Variant 2: use dynamically allocated buffer and snprintf, with constant "Ciao".
char *resultBuffer2 = malloc(maxlen);
const char* second2 = "Marco";
snprintf(resultBuffer2, maxlen, "Ciao %s", second2);
// Variant 3: use dynamically allocated buffer and snprintf, with probably variable "Ciao" and "Marco"
char *resultBuffer3 = malloc(maxlen);
const char* first3 = "Ciao";
const char* second3 = "Marco";
snprintf(resultBuffer3, maxlen, "%s %s", first3, second3);
return 0;
}