Беззнаковое int в массив символов. Альтернатива итоа?

У меня вопрос по поводу беззнаковых целочисленных значений. Я хотел бы преобразовать свой unsigned int в массив символов. Для этого я использую itoa. Проблема в том, что itoa правильно работает с int, но не с unsigned int (unsigned int обрабатывается как обычный int). Как мне преобразовать unsigned int в массив символов?

Заранее благодарим за помощь!


person Ganjira    schedule 16.06.2013    source источник
comment
В C ++ 11 есть std::to_string в <string>.   -  person johnchen902    schedule 16.06.2013
comment
@ johnchen902 Стоит отметить: в GCC на текущий момент (4.9.2) и в нескольких предыдущих версиях отсутствует std::to_string (известный дефект библиотеки).   -  person набиячлэвэли    schedule 24.03.2015


Ответы (2)


использование stringstream является распространенным подходом:

#include<sstream>
...

std::ostringstream oss;
unsigned int u = 598106;

oss << u;
printf("char array=%s\n", oss.str().c_str());

Обновление, начиная с C ++ 11, есть std :: to_string () метод -:

 #include<string>
 ...
 unsigned int u = 0xffffffff;
 std::string s = std::to_string(u);
person suspectus    schedule 16.06.2013

Вы можете просто создать свою собственную функцию, подобную этой:

Ссылка на код на Ideone с использованием СОБСТВЕННОЙ функции

    #include<iostream>
    #include<cstdio>
    #include<cmath>

    using namespace std;

    int main()
    {
        unsigned int num,l,i;

        cin>>num;
        l = log10(num) + 1; // Length of number like if num=123456 then l=6.
        char* ans = new char[l+1];
        i = l-1;

        while(num>0 && i>=0)
        {
            ans[i--]=(char)(num%10+48);
            num/=10;
        }
        ans[l]='\0';
        cout<<ans<<endl;

        delete ans;

        return 0;
    }

Вы также можете использовать функцию sprintf (стандарт в C)

sprintf(str, "%d", a); //a is your number ,str will contain your number as string

Ссылка на код на Ideone с использованием Sprintf

person S J    schedule 16.06.2013
comment
Не изобретайте велосипед, а вместо этого используйте хорошо документированные стандартные библиотечные решения, например std::stringstream или std::to_string(). - person Manu343726; 16.06.2013
comment
Я не пытаюсь изобретать велосипед. Я только что сказал то, что знаю (что использую в своем программировании) ... что более важно. это не так. так что нет необходимости голосовать против ... в любом случае спасибо за это :)! - person S J; 16.06.2013
comment
Что ж, это не так, но ключевая концепция (использование библиотек против повторной реализации когда-либо) неверна. Но, что ж, вы правы, и это не означает, что голосование отклонено. Прости. Прошло 8 минут, и я не могу отменить голос против :( - person Manu343726; 16.06.2013
comment
Нет, сейчас нет необходимости голосовать за !. Я не знаю C ++ 11. Я знаю только C ++ 4.3.2, так что вы правы! - person S J; 16.06.2013
comment
@Shashank_Jain - +1 Я согласен с вами, что вы не используете библиотеку GMP, которую они не разрешают в соревнованиях по программированию! - person ; 18.06.2013