C++中的串联字符串

Concatenating string in C++

本文关键字:字符串 C++      更新时间:2023-10-16

对于这个简单的任务,我需要一个快速的解决方案。

我正在修改一个源代码,它具有以下功能:

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::strings表示的参数:赋值右侧的任何内容都会在涉及左侧目的地之前进行求值。因此,实现这一点的最小直观变化是明确地使+的参数之一为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"

然后把它复制一遍。

当不再使用时,不要忘记删除内存