2010-11-06 5 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 

Long conversassion, но в конце концов он сделал работу. Сброс памяти Hex-памяти и вход с usta были наиболее полезными. Спасибо всем за их время.

+4

-1: Положите больше усилий на вопрос. Что не работает? Какая ошибка или неожиданное поведение вы получаете. Что вы пробовали? –

+0

Спасибо @ Space_C0wb0y за -1 :). Что было так сложно, что вы не могли понять? Посмотрите на тело функции _tmain. – Manjoor

+4

Если что-то не так с вашей программой, это означает, что вы либо не можете ее скомпилировать, либо не будете вести себя так, как ожидалось. Если вы не можете скомпилировать его, отправьте сообщение об ошибке, которую вы получаете. Если поведение неправильное, объясните ожидаемое поведение и то, как фактическое поведение отличается от него. Ограничьте код, который вы публикуете в соответствующих отрывках, а не всю программу. –

ответ

2

Вы не можете просто отличить char * до wchar_t * и ожидать его работы. Вы должны сделать правильное преобразование, например, используя функцию MultiByteToWideChar.

И вообще, будьте очень осторожны с типом приведения и, в частности, избегайте использования C-стиля в программах на C++. Этот пример является хорошим примером того, почему: вы сказали компилятору заткнуться ((SQLWCHAR *) sql) и взамен получили проблему во время выполнения. Используйте броски только тогда, когда вы абсолютно уверены, что делаете правильные вещи и знаете лучше, чем компилятор. Неудивительно, что такие случаи относительно редки ...

+0

Спасибо. Пожалуйста, помогите мне использовать MultiByteToWideChar для преобразования sql var – Manjoor

+0

@Manjoor: 'wchar_t wsql [500]; MultiByteToWideChar (CP_UTF8, 0, sql, strlen (sql), wsql, sizeof wsql/sizeof * wsql); printResult (WriteToSQL (wsql)); ' – usta

+0

Спасибо, я проверил код. MultiByteToWideChar работает нормально, но он не работает как строка SQLWCHAR * s1 = (SQLWCHAR *) L "INSERT INTO OE (sqltext) VALUES ('this text')"; работает. Пожалуйста, обратите внимание на L перед строкой – Manjoor

0

Manjoor, используя _tmain, вы решили использовать общий текст, чтобы быть последовательным и пытаться придерживаться общих типов текста во всей вашей программе. Таким образом, ваш код будет более чистым, и вам не придется использовать неприятные преобразования строк, такие как MultiByteToWideChar. Если вы в состоянии изменить подпись функции WriteToSQL, введите аргумент `s 'как тип SQLTCHAR *. Объявите sql и входные переменные как массивы TCHAR, используйте строковые подпрограммы из TCHAR.H (например, макрос _tprintf вместо printf, _T() для жестко заданных строк ...). Для каждой используемой процедуры вы переходите на ее страницу MSDN и проверяете сопоставление рутинных текстовых сообщений, чтобы узнать, какой из них вы должны использовать.

Google для поддержки Microsoft для UNICODE, чтобы лучше понять проблему, которая была у вас в примере, который вы предоставили.

+0

Я отредактировал вопрос, чтобы быть конкретным для моей проблемы. Пожалуйста, посмотрите – Manjoor

+0

@Manjoor Сначала убедитесь, что MultiByteToWideChar не сработает - проверьте его обратную ошибку. Если это не удается, проверьте его аргументы - особенно те, которые касаются размера буфера - они являются наиболее частым источником ошибок в этом типе функций. Если это не сработает, используйте wprintf в WriteToSQL, чтобы вы могли видеть, будет ли ожидаемая строка передаваться этой функции. –

+0

Это не сработало. После преобразования я могу увидеть значение в моем окне отладки – Manjoor

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 

Предупреждение: Я не проверял, но он должен работать.

Смежные вопросы