LINUX.ORG.RU

помогите пожалуста


0

0

Здраствуйте. Извините за глупый вопрос . Но я только начинаю программировать в линуксе(и вообще). В виндовсе была ф-ция ultoa ... вот я попробовал написать аналог ... но мне он кажется не правильными помогите сделать код "идеальным"
string itoa ( const int i )

string ultoa ( const unsigned long long i )
{
    char buf[30];
    sprintf ( buf, "%u", i );
    int j = 0;
    while ( buf[j] )
        j++;
    string ret ( buf, j );
    return ret;
}
Спасибо большое что откликнулись.
anonymous

const char* ultoa (const unsigned long long i)
{
char buf[30];
sprintf (buf, "%u", i);
return buf;
}

std::string a;
a = ultoa(10);
printf ("%s\n", a.c_str());

anonymous
()
Ответ на: комментарий от anonymous

Так нельзя!

const char* ultoa (const unsigned long long i)
{
// нельзя так : char buf[30];
// можно вот так, например:
char *buf;
buf = new char[30];
sprintf (buf, "%u", i);
return buf;
}

std::string a;
a = ultoa(10);
printf ("%s\n", a.c_str());

Возврат указателя на локальные данные?
К чему это приведет догадываешься?
Можно так:

std::string ultoa(unsigned long long i)
{
  std:ostringstream o;
  o << s;
  return s.str();
}

std::string a(ultoa(10));
std::string b = ultoa(10);
std::cout << a << '\n';

hapchu ★★
()
Ответ на: комментарий от hapchu

Что то я не понял что ты написал?

std::string ultoa(unsigned long long i) { std:ostringstream o; o << s; return s.str(); } Откуда взялась переменная s? и почему не используется i?

anonymous
()
Ответ на: комментарий от anonymous

черт побери :) сам все напутал, прошу прощения

вместо
  std:ostringstream o;
  o << s;
  return s.str();
должно быть
  std:ostringstream o;
  o << i;
  return o.str();

hapchu ★★
()

В C'шном стиле принято в таких случаях передавать буффер и его длину в
параметрах. В данном случае, длину передавать не надо, т.к. она
ограничена и максимальное значение невелико и известно (21), и
это можно указать в документации к функции.

int ulltoa( unsigned long long u, char *buf )
{
    return sprintf( buf, "%llu", u );
};

Можно сделать другой вариант, но с ним у некоторых могут возникнуть
подводные камни:

#define MAX_ULL_LENGTH 20
char *ulltoa( unsigned long long u, char *buf )
{
    char *b = buf?buf:(char*)malloc(MAX_ULL_LENGTH+1);
    if(b) sprintf( b, "%llu", u );
    return b;
};

C++ вариант - hapchu написал.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от watashiwa_daredeska

а можно пояснить, что эта функция делает?

anonymous
()
Ответ на: комментарий от watashiwa_daredeska

Ты меня напугал дружище ! (насчет длины unsigned long).
Я всю жисть считал что макс. длина 11 ("4294967295\0") и соотв.
выделял буфер. А тут прочитал и ужаснулся.
Ты наверно привык к int_64 (long long).

OlegY
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.