2012-09-25 66 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*「字符串」,直到母牛回家。