Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

intToStr ошибка.

21K
13 декабря 2011 года
Apprentice2
25 / / 02.01.2010
Код:
//компилирую в Dev c++  v4.9.9.2.

#include <iostream>

using namespace std;

string intToStr(int val);

int main(){
 int num=21,dec =10;
 string str;
 //char* buf;
 //itoa(num, buf ,dec);
 //str = (const char*)buf;
 str = intToStr(num); // Ошибка сегментации.
 cout<<" Str: " << str << endl;
 system("pause");
}

string intToStr(int val){
 char* buf;
 string str;
 itoa(val, buf ,10);
 str = (const char*)buf;
 return str;
}


Немогу понять в чём дело.
Если выделяю код в отдельную функцию, программа фварийно завершается, и вылетает ошибка.(Ошибка сегментации)
Если не выделяю то всё работает нормально.
297
13 декабря 2011 года
koodeer
1.2K / / 02.05.2009
Размер буфера (char* buf) должен быть достаточен, чтобы вместить любое возможное значение. У вас память под буфер вообще не выделяется!
То, что ошибка возникает не всегда - чистая случайность.
21K
13 декабря 2011 года
Apprentice2
25 / / 02.01.2010
Цитата:
У вас память под буфер вообще не выделяется!


Что требует функция то я и передаю.)

 
Код:
//stdlib.h
_CRTIMP char* __cdecl   _itoa (int, char*, int);


Думаю что по указателю можно присвоить строку любой длинны.
char* buf="9999999999999999999";

Код:
#include <iostream>

using namespace std;

string intToStr(int val);

int main(){
 int num=999999999,dec =10; //num большого размера.
 string str;
 char* buf;
 itoa(num, buf ,dec); //всё пучком!!!
 str = (const char*)buf;
 //str = intToStr(num);
 cout<<" Str: " << str << endl;
 system("pause");
}


 
Код:
То, что ошибка возникает не всегда - чистая случайность.

Случайно не может быть постоянно.
277
13 декабря 2011 года
arrjj
1.7K / / 26.01.2011
Цитата: Apprentice2


itoa(num, buf ,dec); //всё пучком!!!



:facepalm:
itoa
str should be an array long enough to contain any possible value

Надо так:

 
Код:
char*buf=new char[10];
itoa(num,buf,10);
//...
delete [] buf;
41K
14 декабря 2011 года
kisssko
108 / / 28.10.2010
Можно ещё так:
 
Код:
string intToStr(int val){
 char buf[16];
 string str;
 itoa(val, buf ,10);
 str = (const char*)buf;
 return str;
}

Память выделится на стёке, и так быстрей по перфомансу.
21K
14 декабря 2011 года
Apprentice2
25 / / 02.01.2010
Понял, функции надо передать указатель, но указатель на массив.Либо сам массив.
Я просто вначале подумал что указателю присваеваится конвертированная строка и возвращяется.
Код:
#include <iostream>

using namespace std;

char* itox(int sum, char* str, int dec);

int main(){
 char* buf;
 buf =itox(0, buf,0);
 cout<<" Buf: " << buf <<endl;
 system("pause");
}

char* itox(int sum, char* str, int dec){
 char buf[10]={'9','9','9'}; //внутренний буфер для обработки.
 for(int x=0;x<=2 ;++x) //обработка.
  --buf[x];
 str = buf;
 return str;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог