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++ 使用strcpy_将字符串复制到char*_C++_String_Strcpy_Tr24731 - Fatal编程技术网

C++ 使用strcpy_将字符串复制到char*

C++ 使用strcpy_将字符串复制到char*,c++,string,strcpy,tr24731,C++,String,Strcpy,Tr24731,我知道,当您使用strcpy_时,您应该提供目标字符串的大小作为第二个参数。但是如果目标字符串是char*,那么我不确定我做得是否正确。我举三个例子: char* dest = new char; // Example 1 CString strTemp = "Bob"; strcpy_s(dest, strTemp.GetLength() + 1, strTemp); // Example 2 strcpy_s(dest, strlen("Jose")+1, "Jose"); //

我知道,当您使用strcpy_时,您应该提供目标字符串的大小作为第二个参数。但是如果目标字符串是char*,那么我不确定我做得是否正确。我举三个例子:

char* dest = new char;

// Example 1
CString strTemp = "Bob";
strcpy_s(dest, strTemp.GetLength() + 1, strTemp);   

// Example 2
strcpy_s(dest, strlen("Jose")+1, "Jose");

// Example 3 
char* c = new char;
c = "Richard";
strcpy_s(dest, strlen(c) + 1,c);        

这一切都正确吗?

在所有三个示例中,您都在传递源字符串的大小。您应该传递目标缓冲区的大小,以便strcpy_可以验证缓冲区不会溢出

传递源字符串的大小会导致该检查失败。strcpy_已经知道源字符串的大小;它可以像您一样完成strlensrc。它不能做的是自动检测目标缓冲区的大小。需要知道它的大小

const int SIZE = 2048; // an arbitrary large number
char* dest = new char[SIZE];

std::errno_t result = strcpy_s(dest, SIZE, src);   

if (result != 0) {
    // error
}
您的所有示例都应该类似于上面的内容:

dest不是指向单个字符,而是指向大量字符。 第二个参数是目标缓冲区的大小。 确保检查返回代码是否有错误。
<>注意:尽量避免在C++中使用C字符串。使用std::string要好得多。它会帮你处理这一切的。您不必处理内存分配或担心缓冲区溢出。

在所有三个示例中,您都在传递源字符串的大小。您应该传递目标缓冲区的大小,以便strcpy_可以验证缓冲区不会溢出

传递源字符串的大小会导致该检查失败。strcpy_已经知道源字符串的大小;它可以像您一样完成strlensrc。它不能做的是自动检测目标缓冲区的大小。需要知道它的大小

const int SIZE = 2048; // an arbitrary large number
char* dest = new char[SIZE];

std::errno_t result = strcpy_s(dest, SIZE, src);   

if (result != 0) {
    // error
}
您的所有示例都应该类似于上面的内容:

dest不是指向单个字符,而是指向大量字符。 第二个参数是目标缓冲区的大小。 确保检查返回代码是否有错误。 <>注意:尽量避免在C++中使用C字符串。使用std::string要好得多。它会帮你处理这一切的。您不必处理内存分配或担心缓冲区溢出

这些都对吗

没有一个例子是正确的

您已经分配了一个字符。它只能表示空字符串

通过将c指定给别处的点,您已经丢失了new返回的指针值。因此,您不能再将该值传递给delete。这称为内存泄漏

此外,由于C++11,这是格式错误的,因为字符串文字不再可转换为指向非常量字符的指针。格式错误意味着编译程序不需要编译器,而是需要向您发出诊断消息,通知您格式错误

您应该传递目标缓冲区的大小;不是源数据的大小。在这种情况下,目标缓冲区太小,但由于传递了错误的值,因此不会捕获错误,并且行为未定义

如前所述,传递目标缓冲区的大小:

auto error = strcpy_s(dest, 1, "Richard");

这会安全地导致错误,而不是未定义的行为——或者它可能会安全地中止程序或根据实现执行其他操作。您可以控制约束处理程序以获得所需的行为

当然,您可能希望分配足够的内存,以便复制工作:

std::size_t destsz = 1024;
char* dest = new char[destsz];
您知道您分配的大小。只需将其传递给strcpy_s:

别忘了清理:

delete[] dest;
< C++标准库不提供StrucPys。这是一个非标准函数。它仅在C语言中是标准的,但对于提供它的实现来说是可选的

p.S.S不使用new来分配字符串。在C++中使用STD::string。使用std::string,您可以按如下方式复制:

std::string c = "Richard";
std::string dest = c;
使用这种方法将更难泄漏内存或产生更严重的错误

这些都对吗

没有一个例子是正确的

您已经分配了一个字符。它只能表示空字符串

通过将c指定给别处的点,您已经丢失了new返回的指针值。因此,您不能再将该值传递给delete。这称为内存泄漏

此外,由于C++11,这是格式错误的,因为字符串文字不再可转换为指向非常量字符的指针。格式错误意味着编译程序不需要编译器,而是需要向您发出诊断消息,通知您格式错误

您应该传递目标缓冲区的大小;不是源数据的大小。在这种情况下,目标缓冲区太小,但由于传递了错误的值,因此不会捕获错误,并且行为未定义

如前所述,传递目标缓冲区的大小:

auto error = strcpy_s(dest, 1, "Richard");
这会安全地导致错误,而不是未定义的行为——或者可能会安全地导致错误
ort程序或根据实现情况执行其他操作。您可以控制约束处理程序以获得所需的行为

当然,您可能希望分配足够的内存,以便复制工作:

std::size_t destsz = 1024;
char* dest = new char[destsz];
您知道您分配的大小。只需将其传递给strcpy_s:

别忘了清理:

delete[] dest;
< C++标准库不提供StrucPys。这是一个非标准函数。它仅在C语言中是标准的,但对于提供它的实现来说是可选的

p.S.S不使用new来分配字符串。在C++中使用STD::string。使用std::string,您可以按如下方式复制:

std::string c = "Richard";
std::string dest = c;

使用这种方法将更难泄漏内存或产生更严重的错误。

请注意,您应该为目标分配正确的大小,从而替换

char*dest=新字符;它分配一个字符 借

char*dest=新字符[strlenstrTemp+1]

请注意,cString不是一种类型,因此请替换 CString strTemp=Bob; 按字符*strTemp=Bob;或const char*strTemp=Bob;最后一个相当于auto strTemp=Bob

请注意,c样式字符串不是对象,因此strTemp.GetLength无效。将其替换为strlenstrTemp,并包含包含该函数strlen的标题

最后,您的代码应该如下所示

#include<iostream>
#include<cstring>
using namespace std;
int main(){

    auto strTemp = "Bob";
    char* dest = new char[strlen(strTemp)+1];
    strcpy_s(dest, strlen(strTemp) + 1, strTemp);   
    cout<<dest;
}

请注意,您应该为目的地分配正确的大小,因此替换

char*dest=新字符;它分配一个字符 借

char*dest=新字符[strlenstrTemp+1]

请注意,cString不是一种类型,因此请替换 CString strTemp=Bob; 按字符*strTemp=Bob;或const char*strTemp=Bob;最后一个相当于auto strTemp=Bob

请注意,c样式字符串不是对象,因此strTemp.GetLength无效。将其替换为strlenstrTemp,并包含包含该函数strlen的标题

最后,您的代码应该如下所示

#include<iostream>
#include<cstring>
using namespace std;
int main(){

    auto strTemp = "Bob";
    char* dest = new char[strlen(strTemp)+1];
    strcpy_s(dest, strlen(strTemp) + 1, strTemp);   
    cout<<dest;
}

如果在将字符串复制到内存中之前分配内存,那么使用字符串复制函数会显示混乱的思维,导致明显的浪费:只使用或

需要指向目标的指针、目标缓冲区大小和指向源的指针。 如果您猜测缓冲区大小是从源代码派生的所需大小,而不是知道它,那么请使用strcpy而不是那种复杂的方式,希望能够以较低的效率编写相同的缓冲区

总之,你所有的用途都是错误的

旁白: newchar分配一个单独的char,而不是一个大小合适的数组。改用新字符[n]。 您真的需要复制字符串,还是可以只传递一个指针?
整个流程不需要做您想要做的事情。或者实际上是任何有用的东西。

如果在将字符串复制到内存之前分配内存,那么使用字符串复制函数会显示出混乱的思维,导致明显的浪费:只使用或

需要指向目标的指针、目标缓冲区大小和指向源的指针。 如果您猜测缓冲区大小是从源代码派生的所需大小,而不是知道它,那么请使用strcpy而不是那种复杂的方式,希望能够以较低的效率编写相同的缓冲区

总之,你所有的用途都是错误的

旁白: newchar分配一个单独的char,而不是一个大小合适的数组。改用新字符[n]。 您真的需要复制字符串,还是可以只传递一个指针?
整个流程不需要做您想要做的事情。或者实际上是任何有用的东西。

提示:新字符分配多少个字符?您的使用在所有情况下都是不正确的。作为第二个参数传递给strcpy_s的长度需要是第一种情况下的缓冲区长度,即1,因为dest指向单个字符。在第二种情况下,c=Richard会导致丢弃新字符的结果,并且strcpy_s的调用具有未定义的行为,因为它试图修改字符串文字。提示:新字符分配多少个字符?在所有情况下,您的用法都不正确。作为第二个参数传递给strcpy_s的长度需要是第一种情况下的缓冲区长度,即1,因为dest指向单个字符。在第二种情况下,c=Richard导致丢弃新字符的结果,strcpy_s的调用有未定义的行为,因为它试图修改字符串文字。但是如果我想将CString或文字字符串复制到char*中怎么办?strcpy_不是正确的方法吗?但是如果我想将CString或文字字符串复制到char*中怎么办?strcpy_不是正确的方法吗?您可以控制约束处理程序以获得您想要的行为。考虑到这是一个全过程的设置,这有点乐观。更像是它会做最后一个想要更改的任何事情。@重复数据消除程序我不是想给人这样的印象,即他们可以逐个线程对其进行微调。您可以控制约束处理程序以实现所需的行为。考虑到这是一个全过程的设置,这有点乐观。更像
它会做最后一个想要改变的任何事情。@Deduplicator我并不是想给人一种印象,他们可以一个线程一个线程地对它进行微调。