在C ++中连接字符串

时间:2012-09-25 08:30:41

标签: c++ string concatenation

我需要一个快速的解决方案来完成这个简单的任务。

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

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 ++程序员:(

那么,有人可以帮忙吗?

感谢。

7 个答案:

答案 0 :(得分:5)

没有为output_file分配内存。改为使用std::string

std::string s(file_name);
s += ".out";

然后使用s.c_str()作为o saveFile()函数的第一个参数。

答案 1 :(得分:2)

很多人建议使用+=".out"附加到string,这是正确有效的,但不是非常直观。如果你考虑一个更自然的表达......

std::string x = file_name + ".out";

...你会发现它不起作用,因为编译器向char数组添加指向char的指针。数组不能添加到任何内容中,因此编译器会运行标准转换列表,寻找可能有意义的内容。遗憾的是,数组可以转换为另一个指针 - { - 1}}并允许两个指针的数字和(它们最终只是数字),但结果是一个无关的地址(甚至可能由于位大小而包装,这可能甚至不对应于程序的虚拟地址空间,也可能是随机的。在char时,编译器没有考虑+ s方面的参数:在涉及左侧目的地之前评估赋值右侧的任何内容。因此,实现这一工作的最小直观变化是明确地将std::string中的一个参数设为+

std::string

...或...

std::string x = std::string(file_name) + ".out";

作为添加大量内容的表达式从左到右进行评估,一旦你有std::string x = file_name + std::string(".out"); 作为第一个或第二个参数,你可以添加其他ASCIIZ / C / std::string“直到奶牛回家为止。

答案 2 :(得分:1)

当然它会崩溃。 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);

答案 3 :(得分:0)

#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);

答案 4 :(得分:0)

使用std::string让您的生活更轻松:

std::string outputFile(output_file);
outputFile += ".out";

result = dfile->saveFile(outputFile.c_str(), ... );

答案 5 :(得分:0)

全C方法:

output_file = malloc(strlen(output_file) + 5);
strcpy(output_file, file_name);
strcat(output_file, ".out");

P.S。完成w / output_file后,你需要free(output_file)

答案 6 :(得分:0)

您必须为新字符串分配内存,例如:

char *cNewString = malloc(strlen(file_name)+5); //+5 for the ".out"

然后复制它。

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