C++ C+中的复杂结构+;
为了满足strcpy_的要求,我很难获得正确的字符串大小。例如,如果我指定C++ C+中的复杂结构+;,c++,string,C++,String,为了满足strcpy_的要求,我很难获得正确的字符串大小。例如,如果我指定 char buffer = {0}; char *str1 = (char*)&buffer; strcpy_s(str1,sizeof("This is a string\n"),"This is a string\n"); 然后它就会像预期的那样工作。但是,如果我声明: char buffer = {0}; char *str1 = (char*)&buffer; const char* s
char buffer = {0};
char *str1 = (char*)&buffer;
strcpy_s(str1,sizeof("This is a string\n"),"This is a string\n");
然后它就会像预期的那样工作。但是,如果我声明:
char buffer = {0};
char *str1 = (char*)&buffer;
const char* string1 = "This is a string.....";
strcpy_s(str1, ?????,string1);
如果我用文字以外的任何东西来代替?????它将因内存异常而失败,例如,如果我使用std:strlen(str1)等,那么任何大小的文本都可以用于????会有用的。当然,使用固定文字是不可接受的
这是对原问题的重大修改,我向迄今为止回答的人道歉。然而,下面的答案都不起作用。“这是一个字符串”
是一个字符数组。当您说sizeof(Array)/sizeof(type)
时,它将给出数组的大小当您将字符串定义为
const char*
时,sizeof(指针)将为指针分配的大小指定为数组大小
const char* ptr = "This is a string\n";
std::cout<<sizeof("This is a string\n")<<std::endl; //==>18
std::cout<<sizeof(ptr)<<std::endl; //==>4
const char*ptr=“这是一个字符串\n”;
std::cout“这是一个字符串”
是一个字符数组。当您说sizeof(Array)/sizeof(type)
时,它将给出数组的大小
当您将字符串定义为const char*
时,sizeof(指针)将为指针分配的大小指定为数组大小
const char* ptr = "This is a string\n";
std::cout<<sizeof("This is a string\n")<<std::endl; //==>18
std::cout<<sizeof(ptr)<<std::endl; //==>4
const char*ptr=“这是一个字符串\n”;
std::cout在第二个示例中,string1
的类型为const char*
sizeof
将返回指针的大小,而不是指向的字符串文本的长度
第一个示例之所以有效,是因为字符串文字是const char[]
,并且sizeof
将正确返回字符串的长度(但也使用空终止字符)。这只是巧合,因为char
是1字节。不要使用sizeof
获取字符串长度
要使第二个示例正常工作,请尝试使用std::strlen
在第二个示例中,string1
的类型为const char*
sizeof
将返回指针的大小,而不是指向的字符串文本的长度
第一个示例之所以有效,是因为字符串文字是const char[]
,并且sizeof
将正确返回字符串的长度(但也使用空终止字符)。这只是巧合,因为char
是1字节。不要使用sizeof
获取字符串长度
要使第二个示例正常工作,请尝试使用std::strlen
首先,第二个参数是目标缓冲区的大小,而不是源缓冲区的大小
因此,正确的方法是:
char str1[100];
strcpy_s(str1, sizeof str1, "Whatever string");
或
对于数组(第一个示例)sizeof
返回数组的大小
对于指针(第二个示例)sizeof
返回指针的大小(这不是您想要的)首先,第二个参数是目标缓冲区的大小,而不是源缓冲区的大小
因此,正确的方法是:
char str1[100];
strcpy_s(str1, sizeof str1, "Whatever string");
或
对于数组(第一个示例)sizeof
返回数组的大小
对于指针(第二个示例)sizeof
返回指针的大小(这不是您想要的)第二个参数应该是目标的大小,即str1的大小。换句话说,有多少可用空间..您的第一次尝试是不正确的,即使它“起作用”(在某个时候它会崩溃)。这是不正确的,因为您分配了一个只能容纳一个字符的缓冲区,并且您正在复制多个字符。正确的调用应该是strcpy_s(str1,sizeof(buffer),“This is a string\n”)代码>。但是,由于缓冲区只有1个字符长,因此不会得到预期的结果。要查看某些内容,您应该分配足够大的缓冲区:charbuffer[128]
。此缓冲区将保存127个字符长的字符串(加上终止null)。第二个参数应该是目标的大小,即str1的大小。换句话说,有多少可用空间..您的第一次尝试是不正确的,即使它“起作用”(在某个时候它会崩溃)。这是不正确的,因为您分配了一个只能容纳一个字符的缓冲区,并且您正在复制多个字符。正确的调用应该是strcpy_s(str1,sizeof(buffer),“This is a string\n”)代码>。但是,由于缓冲区只有1个字符长,因此不会得到预期的结果。要查看某些内容,您应该分配足够大的缓冲区:charbuffer[128]
。此缓冲区将保存127个字符长的字符串(加上终止null)。