2014-09-28 70 views
0

我有一些代碼看起來是這樣的:修改C字符串

typedef struct 
{ 
    char mode;  //e = encrypt, d = decrypt 
    char* infile; //name of infile 
    char* outfile; //name of outfile 
    char* password; //password string 
} cipher_t; 

int check_files(cipher_t *data) 
{ 
    char temp_path[] = "temp-XXXXX"; 

    if(/** infile == stdin *//) 
    { 
    mkstemp(temp_path); 
    *data.infile = temp_path; 
    } 

    //do stuff and return 

} 

基本上,我想要做的是檢測用戶是否從stdin要輸入數據,如果這樣做一個臨時文件,我可以做東西。

這裏的問題是,當我如上所示設置我的infile路徑時,該數據在退出函數時不會保留,因爲它是局部變量。所以當我退出函數時,臨時文件路徑在結構中丟失。除了物理複製字符串之外,還有什麼可以保留值的嗎?

+0

爲什麼你不想使用'strcpy()'? – user1336087 2014-09-28 06:02:59

+0

您尚未爲您正在使用的指針分配任何空間,即 即cipher_t * data和char * infile。除非你使用malloc分配給它們一些空間,否則它們都是指針和 ,它們將繼續給出分段錯誤,因爲它們沒有任何有效的地址指向。 – 2014-09-28 06:16:46

+0

*「除了物理複製字符串之外,還有什麼可以保留該值的嗎?」*不,在堆棧上創建的字符串無法保存,而無需將字符串複製到堆棧外存儲。所以你唯一的選擇就是不要把字符串放在堆棧中,例如將'infile'的聲明更改爲'char infile [32]',以便字符串的存儲位於結構本身中。 – user3386109 2014-09-28 07:01:57

回答

2

data->infile = strdup(temp_path);

+0

[strdup](http://stackoverflow.com/questions/252782/strdup-what-does-it-do-in-c)使用strcpy。 – user1336087 2014-09-28 06:10:02

+1

@Ani文檔沒有提到任何有關這方面的信息。它可能會使用,可能不會,只要它按照libc的編譯器實現來決定,而不是C標準。事實上,如果你已經知道你要複製的內容的大小(要求爲新字符串分配緩衝區),那麼使用'strcpy()'就沒有什麼意義了,所以'strdup() '只會涉及'strlen()','malloc()'和'memcpy()'。 – Havenard 2014-09-28 06:33:49

+1

'strdup()'必須在任何情況下執行「*物理副本*」。 – alk 2014-09-28 09:33:09

1

除了物理複製串,還有什麼我能做的保留價值?

你可以聲明它static,它可以讓「字符串」在整個程序的實時時間內存活。

static char temp_path[] = "temp-XXXXX"; 

但要知道,這temp_path只存在一次,所以被多個線程訪問可能會導致混亂。

+0

這也意味着'check_files'函數只能在程序的整個生命週期中調用一次。無論它是否是多線程都沒關係。第二次調用函數將保證覆蓋第一個文件名。 – user3386109 2014-09-28 14:41:01