C++ 使用strcpy_将字符串复制到char*
我知道,当您使用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"); //
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我并不是想给人一种印象,他们可以一个线程一个线程地对它进行微调。