Форум программистов, компьютерный форум CyberForum.ru

itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.86
LeX
134 / 134 / 31
Регистрация: 30.06.2010
Сообщений: 537
27.02.2011, 18:48     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #1
доброе утор, день, вечер. нужна реализация itoa, у меня получилось следующее

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
char ito(int value)
    {
        int tmp_value = value;
        value /= 10;
        if (value) result[j]=ito(value);
        j++;
        int k=tmp_value-value*10;
        return ptr[k];
    }
char *itoa(int value) 
    {
        char *result="";
        char *ptr= "0123456789abcdef";
        int j=0;
        result=result+ito(value);
        return result;
    }
компилится. но вылетает на строке

C++
1
return ptr[k];
выскакиевает уведомление. ругается благим компиляторским матом:
Необработанное исключение типа "System.NullReferenceException" произошло в my bnf.exe

Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.
пробовал по разному, выдает ошибки при компиляции

Добавлено через 5 минут
и еще, кто скажет, почему конкат срабатывает криво

C++
1
2
3
4
String^ s=richTextBox1->Lines[i];
String^ t=gcnew String(itoa(253));
String^ k=". ";
String^ h=String::Concat( t, k, s);
в итоге h=t

Добавлено через 6 минут
а если есть другие способы конвертирования числа в String ^ или в char *?)буду благодарен)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2011, 18:48     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию)))
Посмотрите здесь:

Перевод числа в строку C++
C++ Перевод числа в строку
C++ Перевод вещественного числа в строку!
Написать функцию itoa (n,s) преобразования целого числа n в стринг s C++
C++ Перевод из числа в строку
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
28.02.2011, 07:56     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #2
C++
1
if (value) result[j]=ito(value);
а что за result[j], если result - это указатель из другой функции

C++
1
return ptr[k];
ptr тоже из другой функции

C++
1
result=result+ito(value);
что это за операция ?
думаешь, что можно делать "a" + 'b' ?

незнание различий между массивом и указателем
незнание понятия "локальная переменная блока"

да и прототип у неё другой wiki. itoa
LeX
134 / 134 / 31
Регистрация: 30.06.2010
Сообщений: 537
28.02.2011, 18:38  [ТС]     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #3
Цитата Сообщение от accept Посмотреть сообщение
а что за result[j], если result - это указатель из другой функции

ptr тоже из другой функции
они объявлены глобально
C++
1
2
extern  char *result;
extern char *ptr;
Цитата Сообщение от accept Посмотреть сообщение
C++
1
result=result+ito(value);
что это за операция ?
думаешь, что можно делать "a" + 'b' ?
эксперементировал.

Цитата Сообщение от accept Посмотреть сообщение
незнание различий между массивом и указателем
незнание понятия "локальная переменная блока"
как ни удивляйся, это я знаю

спасибо за ссылку)
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.03.2011, 01:57     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #4
Цитата Сообщение от LeX BB
как ни удивляйся, это я знаю
C++
1
2
extern  char *result;
extern char *ptr;
нафик ты пишешь extern, если не знаешь что это ?

Цитата Сообщение от LeX BB
они объявлены глобально
нельзя объявлять глобальные и локальные переменные с одинаковыми именами, уж не говоря о том, что нельзя использовать глобальные переменные без крайней необходимости
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
01.03.2011, 02:55     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #5
Цитата Сообщение от accept Посмотреть сообщение
нельзя объявлять глобальные и локальные переменные с одинаковыми именами
это почему еще? перекрытие имен слыхал
C++
1
2
3
4
5
6
7
int r=0 // глобальная переменная
int main()
{
int r;// локальная
r=0; // обращение к локальной
::r=0;// обращение к глобальной
}
другое дело что сам запутаешься и других запутаешь, но стандарт не запрещает

Цитата Сообщение от accept Посмотреть сообщение
что нельзя использовать глобальные переменные без крайней необходимости
я бы перефразировал
Лучше не использовать ....
по поводу программы
там и алгртитмические ошибки и реализации
C++
1
2
3
4
5
 int tmp_value = value;
                value /= 10;
                if (value) result[j]=ito(value);
                j++;
                int k=tmp_value-value*10;
откуда взялась j чему равна
странный способ вычислить остаток
зачем нужна рекурсия
что будет если число отрицательное???
char *ptr= "0123456789abcdef";почему шеснадцатеричные значения если приводим к десятичным

примерно можно сделать так
1 создаем текстовый буфер и обнуляем его
2 создаем переменную znak
3 проверяем число на отрицательное
4 если отрицательно то znak=истина
5 переводим число в строку например так
C++
1
2
3
4
5
6
7
8
9
10
11
int i=1 
   buf[0]=0; 
   buf[i]='0'
    for( i=1;value;i++)
     {
       int r=value%10;
       value/=10;
       buf[i]=r+'0';
       }
    if(znak)
      buf[i]='-'
в буфере будет строка содержащая число

Добавлено через 2 минуты
может быть надо будет перевернуть буфер
писал на коленке это прсто эскиз
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.03.2011, 04:07     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #6
Цитата Сообщение от ValeryS
я бы перефразировал Лучше не использовать ....
а ты знаешь почему лучше не использовать ?

Цитата Сообщение от ValeryS
но стандарт не запрещает
это не повод, мало ли чего не запрещает стандарт

Добавлено через 1 минуту
C++
1
2
3
4
  int i=1 
   buf[0]=0; 
   buf[i]='0'
    for( i=1;value;i++)
что-то маловато раз i = 1 сделал, да и за край буфера выходишь, не проверяя
а тут buf[i]='0' забыл ; поставить, да и вообще, нафига это делать, если в цикле это сразу меняется
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
01.03.2011, 05:19     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #7
Цитата Сообщение от accept Посмотреть сообщение
а ты знаешь почему лучше не использовать ?
АГА !!!
программирование типа спагетти, трудность контроля(тем более при использовании более 1 блока)
наведенные ошибки...
но есть и достоинства память выделяется при компиляции а не используется стек что очень хорошо для микроконтролеров (там стек очень маленький)
что-то маловато раз i = 1 сделал
цикл выполняется пока value!=0
for( i=1;value;i++)
т.е. i будет равна после цикла размеру числа
Можно конечно через Do While
но я же его придумал с ходу он не оптимизирован и не отлажен.

Цитата Сообщение от accept Посмотреть сообщение
да и за край буфера выходишь
Кто тебе сказал ??? я же не написал какой буфер может быть 1000

Цитата Сообщение от accept Посмотреть сообщение
поставить, да и вообще, нафига это делать, если в цикле это сразу меняется
здесь согласен косяк
не написал условие перед циклом
имелось в виду что если число равно 0 то незачем в цикл заходить записали "0" и все

C++
1
2
3
4
 buf[0]=0; 
   buf[i]='0';
   if(value)
    for( i=1;value;i++)
С уважением Валерий

Добавлено через 13 минут
посмотрел на ссылку да там красивше чем у меня
но зачем они число из отрицательного положительное делают не понял???
проверил на калькуляторе
-45 =0хFFFFFFD3
делим на 10(А) получаем 4
смысла перевода нет
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.03.2011, 06:55     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #8
Цитата Сообщение от ValeryS
но зачем они число из отрицательного положительное делают не понял???
деление с остатком не определено для отрицательных чисел (знак результата зависит от реализации)

Цитата Сообщение от ValeryS
Кто тебе сказал ??? я же не написал какой буфер может быть 1000
хорошо бы проверить на минимальном размере буфера, если цикл падает, значит некачественный

Цитата Сообщение от ValeryS
АГА !!!
программирование типа спагетти, трудность контроля(тем более при использовании более 1 блока)
наведенные ошибки...
видел программы, где десятки функций ?
это когда забываешь, какие функции уже написаны, какие нужно написать, какие переменные созданы, где они созданы, для чего они созданы
и представь, тебе нужно вдруг усовершенствовать функцию, это сразу же влияет на остальную часть программы
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
01.03.2011, 18:35     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #9
деление с остатком не определено для отрицательных чисел (знак результата зависит от реализации)
не знал
видел программы, где десятки функций ?
это когда забываешь, какие функции уже написаны, какие нужно написать, какие переменные созданы, где они созданы, для чего они созданы
и представь, тебе нужно вдруг усовершенствовать функцию, это сразу же влияет на остальную часть программы
Это и есть спагетти программирование
нарушение структуры программы, обращение к функции, переменной из разных мест которые не возможно предсказать
Вот и был придуман Статик

хорошо бы проверить на минимальном размере буфера, если цикл падает, значит некачественный
вот тебе реализация циклами for , do...while
с выделением памяти и с внешним буфером
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
#include "stdafx.h"
 
//функция с циклом  For с динамическим выделением памяти ВОЗМОЖНА УТЕЧКА ПАМЯТИ
char * atoi_For(int value)
{
    int i,size;
    bool neg=false;
    if(value==(int)(-2147483648)) // предельный случай 0x80000000  -(-2147483648)=-2147483648
    {
     char * buf=new char[12];
     buf[11]=0;     //заполнение буфера 1 способ
     buf[10]='8';
     buf[9]='4';
     buf[8]='6';
     buf[7]='3';
     buf[6]='8';
     buf[5]='4';
     buf[4]='7';
     buf[3]='4';
     buf[2]='1';
     buf[1]='2';
     buf[0]='-';
     return buf;
    }
    if(value==0) // предельный случай 0  циклы не будут работать
    {
     char * buf=new char[2];
     buf[1]=0;   //заполнение буфера 1 способ
     buf[0]='0';
     return buf;
    }
    
    int tmp_value=value;
    
    for(size=1;tmp_value;size++) // разряность числа +1 =размер буфера
         tmp_value/=10;
    if(value<0)        // если отрицательно 
    {
    neg=true;                    
    size++;            //добавить размер для знака "-"             
    tmp_value=-value;  // берем модуль числа
    }else
    tmp_value=value;   // берем модуль числа
    char * buf=new char[size];  // выделяем память потом надо удалить для избежания утечки
    buf[size-1]=0;    // конец строки
    
    for(i=size-2;tmp_value;i--) // заполняем буфер
    {
        int tmp=tmp_value%10;  // младший разряд числа
        buf[i]='0'+tmp;        // перводим цифру в литеру
        tmp_value/=10;         // следующий разряд
    }
    if(neg)           
        buf[i]='-';       // если отрицательно добавить в начало "-" 
 
    return buf;           // вернуть строку
}
//функция с циклом  While с динамическим выделением памяти ВОЗМОЖНА УТЕЧКА ПАМЯТИ
char * atoi_While(int value=0)
{
    int size=1;  // начальный размер буфера  1 для завершающего 0
    bool neg=false;
    int tmp_value=value;
    
    if(value==(int)-2147483648)// предельный случай 0x80000000  -(-2147483648)=-2147483648
    {
     char * buf=new char[12]; //заполнение буфера 1 способ
     buf[11]=0;         // конец строки
     buf[10]='8';
     buf[9]='4';
     buf[8]='6';
     buf[7]='3';
     buf[6]='8';
     buf[5]='4';
     buf[4]='7';
     buf[3]='4';
     buf[2]='1';
     buf[1]='2';
     buf[0]='-';
     return buf;
    }
 if(value==0) // предельный случай 0  циклы не будут работать
    {
     char * buf=new char[2];
     buf[1]=0;  //заполнение буфера 1 способ
     buf[0]='0';
     return buf;
    }
 
 do{                        // разряность числа +1 =размер буфера
    size++;
   }while(tmp_value/=10);
    
 if(value<0) // если отрицательно 
    {
    neg=true;   
    size++;   //добавить размер для знака "-"   
    tmp_value=-value; // берем модуль числа
    }else
    tmp_value=value; // берем модуль числа
 
   char * buf=new char[size];    // выделяем память потом надо удалить для избежания утечки
   buf[--size]=0;                 // конец строки
  do                            // заполняем буфер
    {
    
    int tmp=tmp_value%10;      // младший разряд числа
    buf[--size]='0'+tmp;     // перводим цифру в литеру
    }while(tmp_value/=10);   // следующий разряд
   if(neg)
        buf[--size]='-'; // если отрицательно добавить в начало "-"
    return buf;  // вернуть строку
}
//функция с циклом  For с переданым буфером и размером буфера
bool atoi_For_static( char *buf,int sizeBuf,int value=0)
{
 // расчитать размер буфера
    int i,size;
    int tmp_value=value;
    bool neg=false;
    for(size=1;tmp_value;size++)
         tmp_value/=10; 
    if(sizeBuf<size)    // если размера буфера не хватает выходим с ошибкой
          return false;
    if(value<0)         // если число отрицательно буфер должен быть больше для знака "-"
         if(sizeBuf<size+1) 
          return false;
    if(value==(int)(-2147483648))// предельный случай 0x80000000  -(-2147483648)=-2147483648
    {
    sprintf( buf,"%d",-2147483648); //заполнение буфера 2 способ
     return true;
    }
    if(value==0)// предельный случай 0  циклы не будут работать
    {
    sprintf( buf,"%d",0); //заполнение буфера 2 способ
     return true;
    }
    if(value<0)
    {
    neg=true;
    size++;   //добавить размер для знака "-"   
    tmp_value=-value; // берем модуль числа
    }else
    tmp_value=value;  // берем модуль числа
    buf[size-1]=0;    // конец строки
    
    for(i=size-2;tmp_value;i--) // заполняем буфер
    {
        int tmp=tmp_value%10;  // младший разряд числа
        buf[i]='0'+tmp;   // перводим цифру в литеру
        tmp_value/=10;   // следующий разряд
    }
    if(neg)
        buf[i]='-'; // если отрицательно добавить в начало "-"
 
    return true;
}
//функция с циклом  While с переданым буфером и размером буфера
bool atoi_While_static(char *buf,int sizeBuf, int value)
{
    int size=1;// начальный размер буфера  1 для завершающего 0
    int tmp_value=value;
    bool neg=false;
    do{
    size++;
   }while(tmp_value/=10);
    if(sizeBuf<size)   // если размера буфера не хватает выходим с ошибкой
          return false;
    if(value<0)         // если число отрицательно буфер должен быть больше для знака "-"
         if(sizeBuf<size+1) 
          return false;
    if(value==(int)(-2147483648))// предельный случай 0x80000000  -(-2147483648)=-2147483648
    {
    sprintf( buf,"%d",-2147483648);//заполнение буфера 2 способ
     return true;
    }
    if(value==0) // предельный случай 0  циклы не будут работать
    {
    sprintf( buf,"%d",0); //заполнение буфера 2 способ
     return true;
    }
 if(value<0)
    {
    neg=true;
    size++;     //добавить размер для знака "-"   
    tmp_value=-value; // берем модуль числа
    }else
    tmp_value=value;  // берем модуль числа
 
   buf[--size]=0;      // конец строки
  do                  // заполняем буфер
    {
    
    int tmp=tmp_value%10;   // младший разряд числа
    buf[--size]='0'+tmp;   // перводим цифру в литеру
    }while(tmp_value/=10);  // следующий разряд
   if(neg)
        buf[--size]='-';  // если отрицательно добавить в начало "-"
    return true; 
}
 
 
 
 
 
 int _tmain(int argc, _TCHAR* argv[])
{
   char bufer[15];
   char bufer1[5];
    printf("dinamic func\n");
    
      // ТАК ДЕЛАТЬ НЕЛЬЗЯ УТЕЧКА ПАМЯТИ
    printf("%s   For\n",atoi_For(0));
    printf("%s   While\n",atoi_While(0));
    printf("%s   For\n",atoi_For(1234));
    printf("%s   While\n",atoi_While(1234));
    printf("%s   For\n",atoi_For(-1234));
    printf("%s   While\n",atoi_While(-1234));
    printf("%s   For\n",atoi_For(0xFFFFFFFF));
    printf("%s   While\n",atoi_While(0xFFFFFFFF));
    printf("%s   For\n",atoi_For(0x80000001));
    printf("%s   While\n",atoi_While(0x80000001));
    printf("%s   For\n",atoi_For(0x80000000));
    printf("%s   While\n",atoi_While(0x80000000));
    printf("%s   For\n",atoi_For(0x7FFFFFFF));
    printf("%s   While\n",atoi_While(0x7FFFFFFF));
    printf("%s   For\n",atoi_For(1));
    printf("%s   While\n",atoi_While(1));
  printf("static func size bufer 15\n");
 if(atoi_For_static(bufer,sizeof(bufer)/sizeof(char),1))
       printf("%s  For\n",bufer);
   else
       printf("error size bufer\n");
   if(atoi_While_static(bufer,sizeof(bufer)/sizeof(char),1))
       printf("%s   While\n",bufer);
   else
       printf("error size bufer\n");
  if(atoi_For_static(bufer,sizeof(bufer)/sizeof(char),1234))
       printf("%s  For\n",bufer);
   else
       printf("error size bufer\n");
   if(atoi_While_static(bufer,sizeof(bufer)/sizeof(char),1234))
       printf("%s  While\n",bufer);
   else
       printf("error size bufer\n");
  if(atoi_For_static(bufer,sizeof(bufer)/sizeof(char),0x7FFFFFFF))
       printf("%s  For\n",bufer);
   else
       printf("error size bufer\n");
   if(atoi_While_static(bufer,sizeof(bufer)/sizeof(char),0x7FFFFFFF))
       printf("%s   While\n",bufer);
   else
       printf("error size bufer\n");
  if(atoi_For_static(bufer,sizeof(bufer)/sizeof(char),0x80000000))
       printf("%s   For\n",bufer);
   else
       printf("error size bufer\n");
   if(atoi_While_static(bufer,sizeof(bufer)/sizeof(char),0x80000000))
       printf("%s    While\n",bufer);
   else
       printf("error size bufer\n");
  if(atoi_For_static(bufer,sizeof(bufer)/sizeof(char),0x80000001))
       printf("%s   For\n",bufer);
   else
       printf("error size bufer\n");
   if(atoi_While_static(bufer,sizeof(bufer)/sizeof(char),0x80000001))
       printf("%s    While\n",bufer);
   else
       printf("error size bufer\n");
  if(atoi_For_static(bufer,sizeof(bufer)/sizeof(char),0xFFFFFFFF))
       printf("%s   For\n",bufer);
   else
       printf("error size bufer\n");
   if(atoi_While_static(bufer,sizeof(bufer)/sizeof(char),0xFFFFFFFF))
       printf("%s    While\n",bufer);
   else
       printf("error size bufer\n");
if(atoi_For_static(bufer,sizeof(bufer)/sizeof(char),-1234))
       printf("%s   For\n",bufer);
   else
       printf("error size bufer\n");
   if(atoi_While_static(bufer,sizeof(bufer)/sizeof(char),-1234))
       printf("%s   While\n",bufer);
   else
       printf("error size bufer\n");
 
  printf("static func size bufer 5\n");
 
if(atoi_For_static(bufer1,sizeof(bufer1)/sizeof(char),1))
       printf("%s  For\n",bufer1);
   else
       printf("error size bufer\n");
   if(atoi_While_static(bufer1,sizeof(bufer1)/sizeof(char),1))
       printf("%s   While\n",bufer1);
   else
       printf("error size bufer\n");
  if(atoi_For_static(bufer1,sizeof(bufer1)/sizeof(char),1234))
       printf("%s   For\n",bufer1);
   else
       printf("error size bufer\n");
   if(atoi_While_static(bufer1,sizeof(bufer1)/sizeof(char),1234))
       printf("%s   While\n",bufer1);
   else
       printf("error size bufer\n");
  if(atoi_For_static(bufer1,sizeof(bufer1)/sizeof(char),0x7FFFFFFF))
       printf("%s   For\n",bufer1);
   else
       printf("error size bufer\n");
   if(atoi_While_static(bufer1,sizeof(bufer1)/sizeof(char),0x7FFFFFFF))
       printf("%s   While\n",bufer1);
   else
       printf("error size bufer\n");
  if(atoi_For_static(bufer1,sizeof(bufer1)/sizeof(char),0x80000000))
       printf("%s   For\n",bufer1);
   else
       printf("error size bufer\n");
   if(atoi_While_static(bufer1,sizeof(bufer1)/sizeof(char),0x80000000))
       printf("%s   While\n",bufer1);
   else
       printf("error size bufer\n");
  if(atoi_For_static(bufer1,sizeof(bufer1)/sizeof(char),0x80000001))
       printf("%s   For\n",bufer1);
   else
       printf("error size bufer\n");
   if(atoi_While_static(bufer1,sizeof(bufer1)/sizeof(char),0x80000001))
       printf("%s  While\n",bufer1);
   else
       printf("error size bufer\n");
  if(atoi_For_static(bufer1,sizeof(bufer1)/sizeof(char),0xFFFFFFFF))
       printf("%s   For\n",bufer1);
   else
       printf("error size bufer\n");
   if(atoi_While_static(bufer1,sizeof(bufer1)/sizeof(char),0xFFFFFFFF))
       printf("%s  While\n",bufer1);
   else
       printf("error size bufer\n");
if(atoi_For_static(bufer1,sizeof(bufer1)/sizeof(char),-1234))
       printf("%s   For\n",bufer1);
   else
       printf("error size bufer\n");
   if(atoi_While_static(bufer1,sizeof(bufer1)/sizeof(char),-1234))
       printf("%s    While\n",bufer1);
   else
       printf("error size bufer\n");
 
 
    return 0;
 
}
вот скриншот
и никакого перевертывания строки
кстати K&R не обрабатывают предельный случай 0x80000000
-2147483648 у этого числа нельзя взять модуль результат каша
Миниатюры
itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию)))  
LeX
134 / 134 / 31
Регистрация: 30.06.2010
Сообщений: 537
01.03.2011, 18:45  [ТС]     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #10
ValeryS, спасибомне положительные целые числа переводить, так что пример с вики подошел

Добавлено через 7 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
::r=0;// обращение к глобальной
это уже интересно. у меня к вам такой вопрос.
есть глобальные переменные Old и StackSymb, динамической структуры
C++
1
2
3
4
5
struct stack 
    {
        char ch;
        stack *prew;
    };
есть к ним push и pop
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void pop(void)
    {
        Old=StackSymb;
        StackSymb=Old->prew;
        delete(Old);
    }
void push(char c)
    {
        stack *Old=new stack;
        Old->prew=StackSymb;
        StackSymb=Old;
        StackSymb->ch=c;
    }
внутри функций все работает, возвращаемся, и все как и было
пробовал :: перед StackSymb, в этом случае вообще он не меняется.

может отдельный класс для них создать?
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
02.03.2011, 19:31     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #11
все прекрасно только я не понял что за переменные Old и StackSymb
если ты хочешь создать стек то есть только одна переменная вершина стека
реализация тривиальна в любой книге по С она расписана
если ты хочешь создать список то тоже
не в обиду но по моему у тебя проблемы с алгоритмами
читай книги они несет "разумное, доброе,вечное"
с уважением Валерий
С
LeX
134 / 134 / 31
Регистрация: 30.06.2010
Сообщений: 537
02.03.2011, 19:39  [ТС]     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #12
Цитата Сообщение от ValeryS Посмотреть сообщение
все прекрасно только я не понял что за переменные Old и StackSymb
они глобальные, объявляются через extern. Old-переменная для задания нового элемента(в push, т.е. сюда выделяется новый элемент памяти), который потом присвоется вершине StackSymb, а в pop она для удаления вершины, т.е. в Old вершину, а в StackSymb предыдущий элемент списка и очищаем адрес по Old
Цитата Сообщение от ValeryS Посмотреть сообщение
если ты хочешь создать стек то есть только одна переменная вершина стека
реализация тривиальна в любой книге по С она расписана
если ты хочешь создать список то тоже
не в обиду но по моему у тебя проблемы с алгоритмами
читай книги они несет "разумное, доброе,вечное"
с уважением Валерий
С
с динамической памятью работаю давно, 1-, 2-, 4- направленные списки делал еще на паскале, проблем не было, работало как часы. алгоритм знаю как свои 5 пальцев
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
02.03.2011, 20:43     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #13
они глобальные, объявляются через extern.
или я не правильно объяснил или ты не понял
extern не объявление глобальной переменной extern команда линкеру внешняя переменная
file1.c
C++
1
2
3
.........
int x; 
.......
file2.c
C++
1
x=5;// получи ошибку необъяленная переменная
или так
C++
1
2
 extern int x// объеснение компилятору что где то в другом блоке есть  int x
x=5;// усе путем
Old-переменная для задания нового элемента
и с какого перепугу она глобальная
она тебе нужна(нужна ли) чтобы выделить память а потом присвоить это вершине стека
самое что не наесть локальная.
у тебя в структуре нет конструктора копирования(по моему здесь все проблемы)
еще раз повторю
структура и класс это одно и тоже
разница в классе по умолчанию все элементы частные(privat)
а в структуре общие (public)
1-, 2-, 4- направленные списки
одно и двух связные списки знаю(вперед назад)
а четырех это куда ???
LeX
134 / 134 / 31
Регистрация: 30.06.2010
Сообщений: 537
02.03.2011, 21:05  [ТС]     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #14
Цитата Сообщение от ValeryS Посмотреть сообщение
или я не правильно объяснил или ты не понял
extern не объявление глобальной переменной extern команда линкеру внешняя переменная
file1.c
C++
1
2
3
.........
int x; 
.......
file2.c
C++
1
x=5;// получи ошибку необъяленная переменная
или так
C++
1
2
 extern int x// объеснение компилятору что где то в другом блоке есть  int x
x=5;// усе путем
переменные Old и StackSymb у меня объявлены в файле stdafx.cpp, через extern объявлены в его хидере который подключается к исходнику. в этом же хидере описана структура stack. делал как ты объяснил. правильно сделано?

Цитата Сообщение от ValeryS Посмотреть сообщение
и с какого перепугу она глобальная
она тебе нужна(нужна ли) чтобы выделить память а потом присвоить это вершине стека
самое что не наесть локальная.
делаю глобальной что бы использовать в 2 функциях и не создавать 2. в поп и пуш.
она нужна что бы выделить, сохранить адрес и заполнить указатель предыдущей вершиной, потом только этой самой переменной(StackSymb) присвоить адрес новой вершины стека.
у меня вообще возникает ощущение что ты алгоритмику динамических списков не знаешь

Цитата Сообщение от ValeryS Посмотреть сообщение
у тебя в структуре нет конструктора копирования(по моему здесь все проблемы)
еще раз повторю
структура и класс это одно и тоже
разница в классе по умолчанию все элементы частные(privat)
а в структуре общие (public)
а вот здесь можно по подробнее? я почитал про классы, понял что нужен конструктор, а как его реализовать не разбирался особо еще. не поможешь разобраться?

Цитата Сообщение от ValeryS Посмотреть сообщение
одно и двух связные списки знаю(вперед назад)
а четырех это куда ???
это реализация таблицы. на паскале пришлось так извращаться что бы сделать полную прокрутку и что бы не пробегать лишний раз там где не надо. в итоге получилась курсовая, так сказать мини реализация экселя под дос 1946 строк вроде было что ли

Добавлено через 3 минуты
Цитата Сообщение от LeX BB Посмотреть сообщение
делаю глобальной что бы использовать в 2 функциях и не создавать 2. в поп и пуш.
она нужна что бы выделить, сохранить адрес и заполнить указатель предыдущей вершиной, потом только этой самой переменной(StackSymb) присвоить адрес новой вершины стека.
так же и с поп. присваиваем Old старый адресс, StackSymb предыдущий, освобождаем адрес Old
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
02.03.2011, 22:37     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #15
так же и с поп. присваиваем Old старый адресс, StackSymb предыдущий, освобождаем адрес Old
все правильно StackSymb вершина стека
освобождаем адрес Old
она больше не нужна зачем ее хранить
LeX
134 / 134 / 31
Регистрация: 30.06.2010
Сообщений: 537
02.03.2011, 22:43  [ТС]     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #16
Цитата Сообщение от ValeryS Посмотреть сообщение
она больше не нужна зачем ее хранить
ну да, да хранить незачем. согласен. это не суть важно. важно что StackSymb по выходу из pop/push возвращается в состояние до вызова.
можешь сказать что с конструктором делать? я так понял надо как public функции в структуру затолкать pop и push?
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
02.03.2011, 22:49     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #17
я почитал про классы, понял что нужен конструктор
конструктор присутствует всегда
просто есть явный описанный тобой а есть который создает компилятор(по умолчанию) если ты не описал свой.
в отличии от пакаля(делфи) ты его не можешь вызвать явно он вызывается при создании объекта(конструировании)
C++
1
2
3
4
5
class a
{
int b
};
a s;// вызывается конструктор по умолчанию который выделит в памяти место под класс
C++
1
2
3
4
5
6
7
8
class a
{
int b
public:
a(){b=0};
};
a s;// вызывается твой конструктор который выделит в памяти место под класс и инициализирует переменную
s.a()//в с++ ошибка
LeX
134 / 134 / 31
Регистрация: 30.06.2010
Сообщений: 537
02.03.2011, 23:00  [ТС]     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class mystack{
struct stack 
    {
        char ch;
        stack *prew;
};
public: void pop(void)
    {
        Old=StackSymb;
        StackSymb=Old->prew;
        delete(Old);
    }
void push(char c)
    {
        //stack *StackSymb;
        stack *Old=new stack;
        Old->prew=::StackSymb;
        StackSymb=Old;
        StackSymb->ch=c;
    }
}
Добавлено через 26 секунд
а хотя конструктор должен иметь такое же название как и клас?

Добавлено через 1 минуту
я где то встречал еще что можно функции класса описать вроде, да?
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
02.03.2011, 23:02     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #19
Цитата Сообщение от LeX BB Посмотреть сообщение
а хотя конструктор должен иметь такое же название как и клас?
да
деструктор тоже название с тильдой~
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2011, 23:04     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию)))
Еще ссылки по теме:

Перевод из числа в строку C++
C++ перевод числа в строку
C++ Какая dll содержит функцию itoa?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
LeX
134 / 134 / 31
Регистрация: 30.06.2010
Сообщений: 537
02.03.2011, 23:04  [ТС]     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #20
Цитата Сообщение от ValeryS Посмотреть сообщение
да
деструктор тоже название с тильдой~
ммм) push - конструктор, pop - деструктор) интересная идея)
Yandex
Объявления
02.03.2011, 23:04     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию)))
Ответ Создать тему
Опции темы

Текущее время: 18:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru