C++中的字符串串接
对于这个简单的任务,我需要一个快速的解决方案 我正在修改具有以下功能的源代码:C++中的字符串串接,c++,string,concatenation,C++,String,Concatenation,对于这个简单的任务,我需要一个快速的解决方案 我正在修改具有以下功能的源代码: OFCondition MdfDatasetManager::saveFile(const char *file_name, E_TransferSyntax opt_xfer, E_EncodingType opt_enctype,
OFCondition MdfDatasetManager::saveFile(const char *file_name,
E_TransferSyntax opt_xfer,
E_EncodingType opt_enctype,
E_GrpLenEncoding opt_glenc,
E_PaddingEncoding opt_padenc,
OFCmdUnsignedInt opt_filepad,
OFCmdUnsignedInt opt_itempad,
OFBool opt_dataset)
函数内部有一行:
result = dfile->saveFile(file_name, opt_xfer, opt_enctype, opt_glenc,
opt_padenc,
OFstatic_cast(Uint32, opt_filepad),
OFstatic_cast(Uint32, opt_itempad),
(opt_dataset) ? EWM_dataset : EWM_fileformat);
是否查看文件名变量
我想修改,因此文件名将在末尾添加.out
因此,我添加了一个新变量:
char*输出文件
在调用dfile->saveFile函数之前,我添加了:
strcpy(output_file, file_name);
strcat(output_file, ".out");
result = dfile->saveFile(output_file, opt_xfer, opt_enctype, opt_glenc,
opt_padenc,
OFstatic_cast(Uint32, opt_filepad),
OFstatic_cast(Uint32, opt_itempad),
(opt_dataset) ? EWM_dataset : EWM_fileformat);
但是,这是行不通的
应用程序崩溃。我想,问题是我需要初始化*output\u文件
问题是,我不是C++程序员:
那么,有人能帮忙吗
谢谢。没有为输出文件分配内存。请改为使用:
然后使用s.c_str作为saveFile函数的第一个参数。没有为输出_文件分配内存。请改为使用: 然后使用s.c_str作为saveFile函数的第一个参数。使用std::string并使您的生活更轻松:
std::string outputFile(output_file);
outputFile += ".out";
result = dfile->saveFile(outputFile.c_str(), ... );
使用std::string,让您的生活更轻松:
std::string outputFile(output_file);
outputFile += ".out";
result = dfile->saveFile(outputFile.c_str(), ... );
全C方法:
output_file = malloc(strlen(output_file) + 5);
strcpy(output_file, file_name);
strcat(output_file, ".out");
另外,完成后,您需要使用输出文件释放输出文件。全C方法:
output_file = malloc(strlen(output_file) + 5);
strcpy(output_file, file_name);
strcat(output_file, ".out");
另外,完成后,您需要使用输出文件释放输出文件。您必须为新字符串分配内存,例如:
char *cNewString = malloc(strlen(file_name)+5); //+5 for the ".out"
然后把它复制过来
不要忘记在不再使用时删除内存您必须为新字符串分配内存,例如:
char *cNewString = malloc(strlen(file_name)+5); //+5 for the ".out"
然后把它复制过来
不要忘记在不再使用时删除内存当然它会崩溃。输出文件是指向字符数组的指针。但您不分配内存,也不初始化指针。因此,它指向堆上的某个随机区域。当你试图复制到它,应用程序崩溃
size_t total_size = strlen(file_name) + strlen(".out")+1;
char* output_file = new char[total_size];
memset(output_file, 0, total_size)
strcpy(output_file, file_name);
strcat(output_file, ".out");
请注意,您必须删除分配的内存
顺便说一句,为什么不使用std::string,这样就不必在意了
std::string output_file(file_name);
output_file+= ".out";
result = dfile->saveFile(output_file.c_str(), opt_xfer, opt_enctype, opt_glenc,
opt_padenc,
OFstatic_cast(Uint32, opt_filepad),
OFstatic_cast(Uint32, opt_itempad),
(opt_dataset) ? EWM_dataset : EWM_fileformat);
当然它会崩溃。输出文件是指向字符数组的指针。但您不分配内存,也不初始化指针。因此,它指向堆上的某个随机区域。当你试图复制到它,应用程序崩溃
size_t total_size = strlen(file_name) + strlen(".out")+1;
char* output_file = new char[total_size];
memset(output_file, 0, total_size)
strcpy(output_file, file_name);
strcat(output_file, ".out");
请注意,您必须删除分配的内存
顺便说一句,为什么不使用std::string,这样就不必在意了
std::string output_file(file_name);
output_file+= ".out";
result = dfile->saveFile(output_file.c_str(), opt_xfer, opt_enctype, opt_glenc,
opt_padenc,
OFstatic_cast(Uint32, opt_filepad),
OFstatic_cast(Uint32, opt_itempad),
(opt_dataset) ? EWM_dataset : EWM_fileformat);
很多人建议使用+=将.out附加到字符串中,这是正确和有效的,但不是真正直观的。如果你考虑一个更自然的表达……/P>
std::string x = file_name + ".out";
…您会发现它不起作用,因为编译器将指向char的指针添加到char数组中。数组不能添加到任何内容中,因此编译器将运行一系列标准转换,以查找可能有意义的内容。遗憾的是,数组可以转换为另一个指向char的指针,并且允许两个指针的数字和——毕竟它们最终只是数字,但结果是一个不相关的地址,甚至可能由于位大小而被包装,这可能与程序的虚拟地址空间不符,也可能是随机的。在+时,编译器没有考虑std::strings方面的参数:赋值右边的任何内容都是在涉及左侧目标之前计算的。因此,要使其正常工作,最简单的直观更改是显式地将其中一个参数+设置为std::string:
……或者
std::string x = file_name + std::string(".out");
由于添加大量内容的表达式是从左到右计算的,一旦您将std::string作为第一个或第二个参数,就可以添加其他ASCIIZ/C/const char*字符串,直到奶牛回家。许多人建议使用+=将.out附加到字符串,这是正确和有效的,但不是真正直观的。如果你考虑一个更自然的表达……/P>
std::string x = file_name + ".out";
…您会发现它不起作用,因为编译器将指向char的指针添加到char数组中。数组不能添加到任何内容中,因此编译器将运行一系列标准转换,以查找可能有意义的内容。遗憾的是,数组可以转换为另一个指向char的指针,并且允许两个指针的数字和——毕竟它们最终只是数字,但结果是一个不相关的地址,甚至可能由于位大小而被包装,这可能与程序的虚拟地址空间不符,也可能是随机的。在+时,编译器没有考虑std::strings方面的参数:赋值右边的任何内容都是在涉及左侧目标之前计算的。因此,要使其正常工作,最简单的直观更改是显式地将其中一个参数+设置为std::string:
……或者
std::string x = file_name + std::string(".out");
由于添加大量内容的表达式是从左到右计算的,一旦您将std::string作为第一个或第二个参数,就可以添加其他ASCIIZ/C/const char*字符串,直到奶牛回家。已删除。。。我编译成功:已删除。。。我编译成功:请不要写我需要一个快速的解决方案。通往
关于SA的快速解决方案就是给你的问题增加一个悬赏,除此之外,别忘了:你没有付钱,我们没有付钱。因此,我们自己定义优先级。请不要写我需要一个快速的解决方案。快速解决SA问题的方法是在你的问题上增加悬赏,除此之外,别忘了:你没有付钱,我们没有付钱。因此,我们自己定义优先级。