Функция с возратом указателя. Как?

446
10 августа 2017, 23:54

Есть такая фот функция:

void writeProfileFile(char *fileName, String value);

Т.к имена файлов состоят из цифр, пишу так:

int a = numProfileFile;   //исходное число
int radix = 10;  //система счисления
char buffer[20]; //результат
char *p;  //указатель на результат
p = itoa(a,buffer,radix);
writeProfileFile(p,"value");

Всё работает, но это неправильно. Хочу создать функцию которую и буду вызывать, делаю так

char *convertIntToChar(int number)
 {
  int a = number;   
  int radix = 10;  
  char buffer[20]; 
  char *p;  
  p = itoa(a,buffer,radix);
  return p;
 }

Но при вызове writeProfileFile(convertIntToChar(5), String value);

файл не создается. И подозреваю что неправильно сделал функцию convertIntToChar. Как переделать правильно? Спасибо.

Answer 1

Ваша функция возвращает указатель на локальную память. После выхода с функции её значение неопределенно (правда, как выяснилось, некоторые эксперты на собеседованиях спрашивают о том, как использовать это неопределенное значение).

Если Вам доступен с++11 (а сейчас сложно найти компилятор без его поддержки), тогда пишите так

std::string filename = std::to_string(5);
writeProfileFile(filename.c_str(), value);

Если же по какой то причине он недоступен, напишите эту обёртку сами

std::string to_string(int x)
{
   char buf[30];
   itoa(x, buf, 10);
   return std::string(buf);
}

P.S. функцию writeProfileFile лучше написать так, что бы она получала std::string, а не char* на вход. (а может даже const std::string&).

Answer 2

Сделайте, раз уж полная беда с string, так:

char *convertIntToChar(int number)
{
     int a = number;   //исходное число
     int radix = 10;  //система счисления
     static char buffer[20]; //результат
     itoa(a,buffer,radix);
     return buffer;
}

Только учтите, что следующий вызов этой функции будет портить результат предыдущего, так что не сохраняйте этот указатель, а сразу используйте.

Answer 3

В общем проблема решилась так:

char *convertIntToChar(int number)
 {
 int a = number;   //исходное число
 int radix = 10;  //система счисления
 char buffer[20]; //результат
 itoa(a,buffer,radix);
 return buffer;
 }

Проблема была в том, что возвращал не то, что надо. Спасибо всем за помощь в решении вопроса.

READ ALSO
const и перегрузка operator[]

const и перегрузка operator[]

Вопрос касается перегрузки operator[], а именно различия в создании константной и неконстантной версииВ большинстве случаев это будет выглядеть...

473
Проблема при вводе ip из textbox | c++ , winsock

Проблема при вводе ip из textbox | c++ , winsock

При попытке вывести ip, вместо заданного выводятся непонятные цифры

419
Как использовать сопрограммы С++ с Boost.Asio?

Как использовать сопрограммы С++ с Boost.Asio?

Есть прокси-сервер, написанный на асинхронном API BoostAsio - async_* функции и коллбеки

505
Не передаются данные методом POST через ajax

Не передаются данные методом POST через ajax

Решил реализовать на своём сайте поисковикСделал через ajax в js

410