Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > itoa()


Автор: yngwie19 28.4.2009, 09:33
здравствуйте почему при использовании функции itoa() у меня после преобразованного числа идут непонятные символы?
Код

char szText[17];
int nNumber = 5;

itoa(nNumber,szText,10);

MessageBox(NULL,szText,"",MB_OK);

user posted image

или мне нужно обнулять массив szText ?

Автор: zim22 28.4.2009, 09:37
Цитата(yngwie19 @  28.4.2009,  09:33 Найти цитируемый пост)
или мне нужно обнулять массив szText ?

попробуйте обнулить. разве это так сложно?
Код

char szText[17] = {0};

Автор: yngwie19 28.4.2009, 09:39
zim22, мне казалось что за меня это должна делать itoa()  smile

Добавлено через 4 минуты и 22 секунды
а точему если nNumber сделать равным 55, то даже при обнуленном массиве вылезают иероглифы?

Автор: zim22 28.4.2009, 09:56
Цитата(yngwie19 @  28.4.2009,  09:39 Найти цитируемый пост)
а точему если nNumber сделать равным 55, то даже при обнуленном массиве вылезают иероглифы?

не знаю. спросите в разделе по http://forum.vingrad.ru/forum/c-c++system-programming-WinAPI.html

Автор: azesmcar 28.4.2009, 09:59
yngwie19
Вот так что выводит?
Код

MessageBoxА(NULL,szText,"",MB_OK);

Автор: Ln78 28.4.2009, 10:00
yngwie19
язык и компилятор какие? Возможно, MessageBox вызывается MessageBoxW - уникодовская, а тип char а не wchar. С++ должен ругаться, а в C может и пройти, выдавая такую ерунду.

Цитата(zim22 @  28.4.2009,  10:37 Найти цитируемый пост)
разве это так сложно?

char szText[17] = {0};


Круто, обнулить непонятно где находящуюся ячейку памяти, конечно, несложно. Как говорится, дурное дело нехитрое. 

Автор: zim22 28.4.2009, 10:04
Цитата(Ln78 @  28.4.2009,  10:00 Найти цитируемый пост)
Круто, обнулить непонятно где находящуюся ячейку памяти, конечно, несложно. Как говорится, дурное дело нехитрое. 

Вы способны заметить разницу между обнулением единичной ячейки памяти по индексу 17
Код

char szText[17] = 0;

и инициализацию всех элементов массива szText нулями?
Код

char szText[17] = {0};

Автор: azesmcar 28.4.2009, 10:07
удалено (неверно понял написанное)

Автор: mrbrooks 28.4.2009, 10:09
Цитата(Ln78 @  28.4.2009,  10:00 Найти цитируемый пост)
Круто, обнулить непонятно где находящуюся ячейку памяти, конечно, несложно. 

почему это не известно где? ведь задан массив из 17 символов?

Автор: Ln78 28.4.2009, 10:09
Цитата(zim22 @  28.4.2009,  11:04 Найти цитируемый пост)
Вы способны заметить разницу между обнулением единичной ячейки памяти по индексу 17


zim22, пардон. Обычно способен, сейчас не заметил. Вероятно, предлагаемый способ "лечения" смутил, подумал, что обнуление предлагается делать уже после вызова функции.

Автор: mrbrooks 28.4.2009, 10:10
другое дело что обнулить есть смысл через memset



Автор: Acer 28.4.2009, 10:11
yngwie19, воспользуйтесь функцией MessageBoxA, может, как написал Ln78, по умолчанию вызывается MessageBoxW

Автор: yngwie19 28.4.2009, 10:20
Acer, MessageBoxA помогло всем спасибо!

Автор: mrbrooks 28.4.2009, 10:22
Цитата(Acer @  28.4.2009,  10:11 Найти цитируемый пост)
по умолчанию вызывается MessageBoxW 

Генерилась бы ошибка мол не могу преобразовать из char[17]  в LPCWSTR.
Кстати она и так вызывается. Просто при MessageBoxA происходит преобразование строк из анси в юникод и вызывается MessageBoxW.  

Автор: azesmcar 28.4.2009, 10:33
mrbrooks

В си наверняка выдаст warning. Просто люди не обращают внимание на предупреждения.

Автор: zim22 28.4.2009, 11:00
Цитата(mrbrooks @  28.4.2009,  10:10 Найти цитируемый пост)
другое дело что обнулить есть смысл через memset

сначала я хотел с вами не согласиться, т.к. думал, что ассемблерный код, сгенерированный для
Код

char buf[256] = {0};

гораздо меньше, чем вызов memset
Но я был удивлён, когда посмотрел дизассемблерный листинг:

char buf[256] = {0};
Код

002D3B70  mov         byte ptr [ebp-114h],0 
002D3B77  push        0FFh 
002D3B7C  push        0    
002D3B7E  lea         eax,[ebp-113h] 
002D3B84  push        eax  
002D3B85  call        @ILT+525(_memset) (2D1212h) 
002D3B8A  add         esp,0Ch 

Т.е. memset всё-равно вызывается smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)