Нужна помощь по функции Sting номер 2 Dissection C ++ - PullRequest
0 голосов
/ 18 марта 2011

Я обнаружил ошибку в функции ниже. Когда temp = 10. Он преобразует temp в строку '01'. вместо строки «10». Я не могу сказать, почему? Есть ли лучший способ конвертировать Num в Str? Спасибо.

завершено Num2Str (), как это,

static bool Num2Str(string& s, const T& value)
{
    int temp = static_cast<int>(value); // When temp = 10. 

    s.push_back(char('0' + temp % 10));
    temp /= 10;

    while(temp != 0)
    {
        s.push_back(char('0' + temp % 10));
        temp /= 10;
    }
    if(s.size() == 0)
    {
        return false;
    }

    if(s.find_first_not_of("0123456789") != string::npos)
    {
        return false;
    }

    return true;
}

Ответы [ 4 ]

3 голосов
/ 18 марта 2011

Используйте std::ostringstream для преобразования чисел в строки.

Не используйте бесплатные статические функции в C ++;вместо этого используйте безымянные пространства имен.

#include<sstream>
#include<string>

namespace {
void f()
{
    int value = 42;
    std::ostringstream ss;
    if( ss << value ) {
        std::string s = ss.str();
    } else {
      // failure
    }
}
}
1 голос
/ 18 марта 2011

Вы также можете использовать boost :: lexical_cast (см. http://www.boost.org/doc/libs/1_46_1/libs/conversion/lexical_cast.htm)

Например:

void log_message(const std::string &);

void log_errno(int yoko)
{
    log_message("Error " + boost::lexical_cast<std::string>(yoko) + ": " + strerror(yoko));
}
1 голос
/ 18 марта 2011

Мой фаворит - рекурсивная версия (в основном на C) для перестановки цифр в правильном порядке.

    void u2str(string& s, unsigned value){
        unsigned d = value % 10;
        value /= 10;
        if (value > 0 )
            u2str(s,value);
        s.push_back('0'+d);
    }

Для 0 вы получаете «0», но во всех других случаях вы не используетеведущие нули.Как показано, предполагается, что строка более эффективна при добавлении, чем при вставке.Однако, если вставить, то вам не нужен рекурсивный трюк (например, ответ Кейта).

1 голос
/ 18 марта 2011

Для решения в духе существующего кода (хотя я бы предпочел существующее встроенное int преобразованию строк):

template<class T>
static std::string Num2Str(const T& value)
{
    std::string s;
    int temp = static_cast<int>(value);
    if (!temp)
    {
        s = "0";
        return s;
    }
    while(temp != 0)
    {
        s.insert(0,1,(char('0' + temp % 10)));
        temp /= 10;
    }

    return s;
}

Необходимо добавить поддержку отрицательных значений, проверку диапазона и т. Д.

...