转换问题从char *到wchar_t *

时间:2010-11-06 12:51:45

标签: c++ types

以下行有效。它打印成功。

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

长时间的交谈,但最终确实奏效了。来自usta的十六进制内存转储和输入是最有帮助的。谢谢大家的时间。

3 个答案:

答案 0 :(得分:2)

您不能只将char *转换为wchar_t *并期望它能够正常运行。您必须进行适当的转换,例如使用MultiByteToWideChar函数。

一般来说,要非常小心类型转换,特别是避免在C ++程序中使用C风格的转换。这种情况就是一个很好的例子:你告诉编译器关闭((SQLWCHAR *) sql),并在运行时遇到问题。只有当你完全确定你做的是正确的事情时才使用强制转换,并且比编译器更清楚。毫不奇怪,这种情况相对罕见......

答案 1 :(得分: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

警告:我没有测试它,但它应该可以工作。

答案 2 :(得分:0)

Manjoor,通过使用_tmain,您选择使用通用文本,因此请保持一致并尝试在整个程序中坚持使用通用文本类型。这样你的代码就会变得更干净,你不需要像MultiByteToWideChar那样使用令人讨厌的字符串转换。如果您有能力更改WriteToSQL函数签名,请将参数's'作为SQLTCHAR *类型传递。将sql和输入变量声明为TCHAR数组,使用来自TCHAR.H的字符串例程(例如_tprintf而不是printf,_T()宏用于硬编码字符串......)。对于您正在使用的每个例程,请转到其MSDN页面并检查通用文本例程映射以查看您应使用的例程。

Google支持Microsoft对UNICODE的支持,以便更好地了解您提供的示例中的问题。