在C++中连接字符串
对于这个简单的任务,我需要一个快速解决方案。在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变量?
我想修改,所以file_name将在最后添加“.out”。
因此,我添加了一个新变量:
char * output_file;
并调用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()
作为第一个参数o saveFile()
函数
#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);
*已删除* ...我编译成功:) – ewlung
使用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");
附:完成w/output_file后,您需要free(output_file)
。
C-C-Combo断路器。 –
您必须为新的字符串分配内存,例如:
char *cNewString = malloc(strlen(file_name)+5); //+5 for the ".out"
然后将它复制过来。
不要忘记当不再使用时删除内存
当然,它确实崩溃。 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 :: 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"
到string
,这是正确的和有效的建议,但没有真正直观。如果你考虑一个更自然的表情......
std::string x = file_name + ".out";
...你会发现这是行不通的,因为编译器增加了一个指针,TO-char
到char
阵列。数组无法添加到任何内容,因此编译器会通过一系列标准转换来寻找可能有意义的内容。令人遗憾的是,该数组可以转换为另一个指针,并允许两个指针的数字总和(它们最终只是数字),但结果是一个不相关的地址(甚至可能由于比特大小),它甚至可能不符合你的程序的虚拟地址空间,也可能是随机的。在+
时间编译器没有考虑std::string
条款中的参数:在涉及左侧目标之前评估任务右侧的任何内容。所以,最小直观的改变来获取工作是明确地做出参数之一+
是std::string
:
std::string x = std::string(file_name) + ".out";
......或者......
std::string x = file_name + std::string(".out");
作为,增加了一种表达很多东西从左到右进行评估,一旦你得到std::string
作为第一个或第二个参数,你可以添加其他ASCIIZ/C/const char*
“字符串”,直到母牛回家。
请不要写“我需要一个快速解决方案”。在SA上快速获得解决方案的方法是为您的问题添加赏金,除此之外,请不要忘记:您没有付款,我们没有付款。因此,我们定义优先权自己。 –