2011-06-10 51 views
0

我有一個使用OPENFILENAME的工作代碼。可我知道如何使用strcat的動態控制其參數如何在C編程中在OPENFILENAME參數中strcat

這一項工作

//ofn.lpstrFilter = "Rule Files (*.net and *.rul)\0*.rul;*.net\0"; 

char filter[100]; 
char filterText[100]; 
char filterVal[100]; 
strcpy(filterText, "Rule Files (*.net and *.rul)"); 
strcpy(filterVal, "*.rul;*.net"); 

我使用strcat的第一次嘗試用「\ 0」,但它也只是這樣表示
strcat (filter, filterText);
strcat (filter,"\0");
strcat (filter,filterVal);
strcat (filter,"\0");
ofn.lpstrFilter = filter; \\missing \0

,我試圖用 '\\ 0'
strcat (filter, filterText);
strcat (filter,"\\0");
strcat (filter,filterVal);
strcat (filter,"\\0");

ofn.lpstrFilter = filter; \\now includes the\0

但是當我運行該程序的對話框過濾器這樣表示
「規則文件(* .net和* .rul)\ 0 * .rul; *。net \ 0「;

感謝

+0

'strcat'連接字符串...你想conca tenate或* split *一個字符串,實際上需要'strtok'? – Jason 2011-06-10 02:49:36

+0

您之前所做的是正確的。爲什麼你想顯示終止字符? – Mahesh 2011-06-10 02:54:48

+0

@ Jason&Mahesh - 我想動態地允許其他用戶設置過濾器文本和過濾器值。所以其他用戶可能只是希望使用其他選項而不是靜態類型過濾器,其他用戶可能希望他們的過濾器像這樣ofn.lpstrFilter =「All Files(\ *。*)\ 0 *。* \ 0」; – Aries 2011-06-10 03:30:51

回答

1

使用"\\0"不會做任何有用的事情,當你想要一個NULL字節,這將只是把文字的兩個字符\0在你的字符串。但是,C中的字符串由'\0'終止,所以不能使用strcat構造一個沒有指針算術位的nul分隔字符串。

因此,考慮到這些:

char filterText[] = "Rule Files (*.net and *.rul)"; 
char filterVal[] = "*.rul;*.net"; 
char filter[100]; 

你需要做這樣的事情:

/* 
* The first one is a straight copy. 
*/ 
strcpy(filter, filterText); 

/* 
* Here we need to offset into filter to right after the 
* nul byte from the first copy. 
*/ 
strcpy(&filter[strlen(filterText) + 1], filterVal); 

一個更好的方法是你的filtermalloc分配,這樣你不不必擔心緩衝區溢出:

char *filter = malloc(strlen(filterText) + 1 + strlen(filterVal) + 1); 
+0

@mu太短 - 謝謝你的回答以及malloc建議。 – Aries 2011-06-10 05:44:24

+0

甚至:'size_t txt_len = strlen(filterText); size_t val_len = strlen(filterVal); char * filter = malloc(txt_len + val_len + 1); memmove(filter,filterText,txt_len); memmove(filter + txt_len,filterVal,val_len + 1);',可選擇用'memcpy()'代替'memmove()',因爲它在這個上下文中是安全的,儘管'memmove()'總是安全的,'memcpy() '並不總是安全的。(如果目標是在結果中有兩個由NUL分隔的字符串,則需要調整由+1分配的長度,由+1複製的第一個長度以及由第二個副本+1的偏移量;或者等同的一組變化)。 – 2011-06-10 06:23:38

+0

@Jonathan:因爲'fitlerVal'是'char []',所以你也可以使用'sizeof(filterVal)'來代替'strlen(filterVal)+ 1'。這個奇怪的nul-delimited格式是標準文件對話框(AFAIK)的Windows操作系統,因此您需要額外的1.或者只是將整個事件聲明爲一個'char []'作爲'{'R','u' ,...}。 – 2011-06-10 06:44:02