C++中的串联字符串
Concatenating string in C++
对于这个简单的任务,我需要一个快速的解决方案。
我正在修改一个源代码,它具有以下功能:
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);
看到file_name变量了吗?
我想修改,所以文件名将在末尾添加".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_file?
问题是,我不是C++程序员:(
那么,有人能帮忙吗?
谢谢。
尚未为output_file
分配内存。改为使用std::string
:
std::string s(file_name);
s += ".out";
然后使用s.c_str()
作为saveFile()
函数的第一个参数。
很多人建议使用+=
将".out"
附加到string
,这是正确有效的,但并不直观。如果你考虑一个更自然的表达。。。
std::string x = file_name + ".out";
您会发现它不起作用,因为编译器向char
数组添加了一个指向-char
的指针。数组不能添加到任何内容中,因此编译器会运行一个标准转换列表,以寻找可能有意义的内容。遗憾的是,数组可以转换为另一个指向-char
的指针,并且允许两个指针的数字和(毕竟它们最终只是数字),但结果是一个不相关的地址(由于位大小的原因,它甚至可能会换行),它甚至不对应于程序的虚拟地址空间,而且可能是随机的。在+
时,编译器没有考虑以std::string
s表示的参数:赋值右侧的任何内容都会在涉及左侧目的地之前进行求值。因此,实现这一点的最小直观变化是明确地使+
的参数之一为std::string
:
std::string x = std::string(file_name) + ".out";
或
std::string x = file_name + std::string(".out");
由于添加了很多内容的表达式是从左到右计算的,一旦你有了std::string
作为第一个或第二个参数,你就可以添加其他ASCIIZ/C/const char*
"字符串",直到奶牛回家。
它当然会崩溃。output_file是一个指向字符数组的指针。但您既不分配内存,也不初始化指针。因此,它指向堆上的某个随机区域。当你试图复制到它时,应用程序会崩溃。
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::字符串,这样你就不必在意了?
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);
#include <string> // at the top of the program
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);
使用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");
附言:完成output_file后,您需要free(output_file)
。
您必须为新字符串分配内存,例如:
char *cNewString = malloc(strlen(file_name)+5); //+5 for the ".out"
然后把它复制一遍。
当不再使用时,不要忘记删除内存