2010-11-06 106 views
-1

下面的代碼行得通。它打印成功。從char *到wchar_t的轉換問題*

wchar_t * s1 = (wchar_t *) L"INSERT INTO OE(sqltext) VALUES('this text')"; 

if(WriteToSQL(s1) == 0) 
    printf("Success");  //Success 
else 
    printf("Failed");  

我需要用戶輸入來創建動態SQL。我需要做什麼 L前綴正在做。

當我接受輸入並進行所需的轉換時,它不起作用。

char input[100]; 
char sql[500]; 

printf("Enter input string :: "); 
fgets(input,100,stdin); 
for(int i=0;i<100;i++) 
    if(input[i]==10) 
     input[i]=0; 

strcpy(sql,"INSERT INTO OE(sqltext) VALUES('"); 
strcat(sql,input); 
strcat(sql,"')"); 

wchar_t wsql[500]; 
MultiByteToWideChar(CP_UTF8, 0, sql, strlen(sql), 
wsql, strlen(sql) + 1); 


if(WriteToSQL(wsql) == 0) 
    printf("Success");  
else 
    printf("Failed");  // It failed 

朗conversassion但最後卻沒有工作。來自usta的十六進制內存轉儲和輸入最有用。謝謝大家的時間。

+4

-1:把更多的精力放在一個問題上。什麼不起作用?你得到了什麼錯誤或意外的行爲。你有什麼嘗試? – 2010-11-06 12:57:02

+0

謝謝@ Space_C0wb0y爲-1 :)。你聽不懂的東西太複雜了?看看_tmain函數體。 – Manjoor 2010-11-06 12:58:42

+4

如果您的程序出現問題,意味着您無法編譯它,或者它的行爲不如預期。如果您無法編譯它,請發佈您收到的錯誤。如果行爲錯誤,請解釋預期行爲以及實際行爲與其不同之處。限制你發佈相關段落的代碼,而不是整個程序。 – 2010-11-06 13:01:50

回答

2

你不能只投char *wchar_t *,並期望它工作。您必須進行適當的轉換,例如使用MultiByteToWideChar函數。

一般來說,要非常小心類型轉換,特別是避免在C++程序中使用C風格轉換。這種情況就是一個很好的例子:你告訴編譯器關閉((SQLWCHAR *) sql),然後在運行時遇到問題。只有當你確信自己做得對,並且比編譯器更好的時候才使用強制轉換。毫不奇怪,這種情況相對較少...

+0

謝謝。請幫我使用MultiByteToWideChar來轉換sql var – Manjoor 2010-11-06 13:43:42

+0

@Manjoor:'wchar_t wsql [500]; MultiByteToWideChar(CP_UTF8,0,sql,strlen(sql),wsql,sizeof wsql/sizeof * wsql); printResult(WriteToSQL(wsql));' – usta 2010-11-06 13:58:26

+0

謝謝,我檢查了代碼。 MultiByteToWideChar工作正常,但它不能作爲行SQLWCHAR * s1 =(SQLWCHAR *)L「INSERT INTO OE(sqltext)VALUES('this text')」;作品。請注意字符串前的L – Manjoor 2010-11-06 14:09:08

0

Manjoor,通過使用_tmain,您選擇使用通用文本,以便保持一致,並嘗試在整個程序中使用通用文本類型。這樣你的代碼就會更乾淨,你不需要使用像MultiByteToWideChar這樣的討厭的字符串轉換。如果您有權更改WriteToSQL函數簽名,請將參數's'作爲SQLTCHAR *類型傳遞。將SQL和輸入變量聲明爲TCHAR數組,使用TCHAR.H中的字符串例程(例如_tprintf代替printf,_T()宏,用於硬編碼字符串...)。對於您正在使用的每個例程,請轉到其MSDN頁面並檢查通用文本例程映射以查看您應該使用哪一個。

谷歌微軟支持UNICODE,以便更好地理解您在提供的示例中遇到的問題。

+0

我編輯過的問題是特定於我的問題。請看看 – Manjoor 2010-11-06 14:31:25

+0

@ Manjoor首先確保MultiByteToWideChar不失敗 - 檢查它的返回錯誤。如果失敗,請檢查它的參數 - 特別是有關緩衝區大小的參數 - 它們是此類函數中最常見的錯誤源。如果不失敗,請在WriteToSQL中使用wprintf,以便查看是否將期望的字符串傳遞給該函數。 – 2010-11-06 14:48:53

+0

它沒有失敗。轉換後,我可以看到我的調試窗口中的值 – Manjoor 2010-11-06 14:51:34

1

爲什麼不全面使用寬字符? 像這樣:

wchar_t input[100]; 
wchar_t sql[500]; 

wprintf(L"Enter input string :: "); 
fgetws(input,100,stdin); 
for(int i=0;i<100;i++) 
    if(input[i]==10) 
     input[i]=0; 

wcscpy(sql,L"INSERT INTO OE(sqltext) VALUES('"); 
wcscat(sql,input); 
wcscat(sql,L"')"); 


if(WriteToSQL(sql) == 0) 
    printf("Success");  
else 
    printf("Failed");  // It failed 

警告:我沒有測試它,但它應該工作。