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问题的方法是在你的问题上增加悬赏,除此之外,别忘了:你没有付钱,我们没有付钱。因此,我们自己定义优先级。