Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的复杂结构+;_C++_String - Fatal编程技术网

C++ C+中的复杂结构+;

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

为了满足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* 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)。