2012-09-25 51 views
1

对于这个简单的任务,我需要一个快速解决方案。在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++程序员:(

所以,任何人都可以帮助

感谢

+1

请不要写“我需要一个快速解决方案”。在SA上快速获得解决方案的方法是为您的问题添加赏金,除此之外,请不要忘记:您没有付款,我们没有付款。因此,我们定义优先权自己。 –

回答

5

无记忆已经被分配给output_file使用std::string代替:。

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

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

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); 
+0

*已删除* ...我编译成功:) – ewlung

0

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

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

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

的所有的C方法:

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

附:完成w/output_file后,您需要free(output_file)

+1

C-C-Combo断路器。 –

0

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

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

然后将它复制过来。

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

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

很多人在使用+=追加".out"string,这是正确的和有效的建议,但没有真正直观。如果你考虑一个更自然的表情......

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

...你会发现这是行不通的,因为编译器增加了一个指针,TO-charchar阵列。数组无法添加到任何内容,因此编译器会通过一系列标准转换来寻找可能有意义的内容。令人遗憾的是,该数组可以转换为另一个指针,并允许两个指针的数字总和(它们最终只是数字),但结果是一个不相关的地址(甚至可能由于比特大小),它甚至可能不符合你的程序的虚拟地址空间,也可能是随机的。在+时间编译器没有考虑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*“字符串”,直到母牛回家。