Альтернатива itoa () для преобразования целого числа в строку C ++? [Дубликат]

Эта статья от perfectionkills.com , вероятно, даст вам некоторое представление о том, как это делается, и почему вы не должны делать это.

(Кстати, jQuery не расширяет DOM-элементы. Вместо этого они используют оболочки DOM.)

140
задан Tshepang 29 June 2012 в 16:58
поделиться

11 ответов

В C++ 11 можно использовать std::to_string :

#include <string>

std::string s = std::to_string(5);

, Если Вы работаете с до C++ 11, Вы могли бы использовать потоки C++:

#include <sstream>

int i = 5;
std::string s;
std::stringstream out;
out << i;
s = out.str();

Взятый от http://notfaq.wordpress.com/2006/08/30/c-convert-int-to-string/

172
ответ дан bobobobo 29 June 2012 в 16:58
поделиться
  • 1
    @Eric Lippert: В то время как я думаю, что это сам последовательно, некоторые могли бы думать, что существует разногласие здесь. Вы возражали бы добавлять объяснение относительно того, почему поведение MS.NET лучше, чем Моно поведение? Мой мозг can' t придумывают, почему это хорошо прямо сейчас, и я думаю, что это сделало бы ответ больше завершенный... – Jason Punyon♦ 17 May 2010 в 00:46

Большинство вышеупомянутых предложений технически не является C++, они - решения C.

Изучают использование станд.:: stringstream.

-1
ответ дан OJ. 29 June 2012 в 16:58
поделиться
  • 1
    Превосходный вопрос. Посмотрите ниже. – Eric Lippert 17 May 2010 в 21:35

Выделите строку достаточной длины, затем используйте snprintf.

3
ответ дан Iain 29 June 2012 в 16:58
поделиться

На полученных платформах Windows CE нет никаких iostream с по умолчанию. Способ пойти существует preferaby с _itoa<> семья, обычно _itow<> (так как большая часть строкового материала является Unicode там так или иначе).

0
ответ дан Johann Gerell 29 June 2012 в 16:58
поделиться
  • 1
    Вы знаете you' ре, имеющее хороший день, когда Eric Lippert говорит Вам you' право ре. Спасибо за ответ на bat сигнал:) – Jason Punyon♦ 17 May 2010 в 22:21

Негласно, lexical_cast делает это:

std::stringstream str;
str << myint;
std::string result;
str >> result;

, Если Вы не хотите "притягивать" повышение для этого, затем с помощью вышеупомянутого, хорошее решение.

20
ответ дан 1800 INFORMATION 29 June 2012 в 16:58
поделиться
  • 1
    +1: There' s действительно никакое хорошее использование перезагрузки. – S.Lott 28 March 2010 в 22:33

Археология

itoa был нестандартной функцией помощника, разработанной для дополнения atoi стандартной функции, и вероятно сокрытие sprintf (Большинство его опций может быть реализовано с точки зрения sprintf): http://www.cplusplus.com/reference/clibrary/cstdlib/itoa.html

Путь C

Использование sprintf. Или snprintf. Или безотносительно инструмента Вы находите.

Несмотря на факт некоторые функции не находятся в стандарте, как справедливо упомянуто "onebyone" в одном из его комментариев, большая часть компилятора предложит Вам альтернативу (например, Visual C++ имеет свой собственный _snprintf, Вы можете определение типа к snprintf при необходимости в нем).

C++ путь.

Использование потоки C++ (в текущем станд. случая:: stringstream (или даже станд. устаревший:: strstream, как предложено Herb Sutter в одной из его книг, потому что это несколько быстрее).

Заключение

Вы находитесь в C++, что означает, что можно выбрать способ, которым Вы хотите его:

  • более быстрый путь (т.е. путь C), но необходимо быть уверены, что код является узким местом в приложении (преждевременная оптимизация является злой, и т.д.), и что код безопасно инкапсулируется, чтобы не рисковать переполнением буфера.

  • более безопасный путь (т.е. C++ путь), если Вы знаете, эта часть кода не очень важна, так лучше быть уверенной, что эта часть кода не повредит наугад моменты, потому что кто-то перепутал размер или указатель (который происходит в реальной жизни, как... вчера, на моем компьютере, потому что кто-то думал, что это "охлаждается" для использования более быстрого пути, действительно не нуждаясь в нем).

47
ответ дан paercebal 29 June 2012 в 16:58
поделиться
  • 1
    +1 для показа меня, что я должен, действительно действительно, писать тесты вместо того, чтобы делать вещи в интерпретаторе вручную, даже для точной настройки. Это также было бы полезно для будущего нерегрессионного тестирования. – Joël 2 November 2011 в 16:25

Попробуйте sprintf ():

char str[12];
int num = 3;
sprintf(str, "%d", num); // str now contains "3"

sprintf () похож на printf (), но выводы к строке.

кроме того, как Parappa упомянул в комментариях, Вы могли бы хотеть использовать snprintf (), чтобы мешать переполнению буфера произойти (где число, которое Вы преобразовываете, не соответствует размеру Вашей строки.) Это работает как это:

snprintf(str, sizeof(str), "%d", num);
34
ответ дан Jeremy Ruten 29 June 2012 в 16:58
поделиться
  • 1
    Какой I' m выполнение для нахождения этого вопроса, I' m использование консоли для исследования структуры данных, импортированной из JSON. Я хочу использовать " reload" для хранения некоторых функций в моем текстовом редакторе, которые пересекают структуру по-разному отредактируйте их, затем повторно выполните их, не имея необходимость выходить из консоли. Однако, если Python can' t поддержка, что чисто, по причинам реализации, таким как эта неспособность удалить " leftovers" я предполагаю, что должен быть неправ хотеть сделать это;-p +1 для ответа, который позволяет мне сделать это так или иначе, все же. – Steve Jessop 19 April 2011 в 09:04

повышение:: lexical_cast работает вполне прилично.

#include <boost/lexical_cast.hpp>
int main(int argc, char** argv) {
    std::string foo = boost::lexical_cast<std::string>(argc);
}
54
ответ дан Leon Timmermans 29 June 2012 в 16:58
поделиться
  • 1
    You' ll редко видят, что я привожу доводы против модульных тестов, но существуют определенно сценарии когда you' разработка прототипа ре, где это было бы ценно. Не не соглашаясь с полным чувством, но ' один из худших ways' довольно серьезная субъективная оценка. – medwards 25 January 2014 в 11:01

Обратите внимание, что все из эти stringstream методы могут включать блокировку вокруг использования объекта языкового стандарта для форматирования. Это может быть чем-то, чтобы опасаться при использовании этого преобразования из нескольких потоков...

Посмотрите здесь для больше. Преобразовывают число в строку с указанной длиной в C++

1
ответ дан Community 29 June 2012 в 16:58
поделиться
  • 1
    +1 svn import работы с единственным файлом. svn import file.txt http://svn.example.com/repo/trunk/file.txt – Alex Jasmin 22 October 2010 в 20:19

Попробуйте Boost.Format или FastFormat , обе высококачественные библиотеки C ++:

int i = 10;
std::string result;

WIth Boost.Format

result = str(boost::format("%1%", i));

или FastFormat

fastformat::fmt(result, "{0}", i);
fastformat::write(result, i);

Очевидно, что они оба делают гораздо больше, чем простое преобразование одного целого числа

6
ответ дан 23 November 2019 в 23:13
поделиться

Фактически вы можете преобразовать что угодно в строку с помощью одной грамотно написанной функции-шаблона. В этом примере кода используется цикл для создания подкаталогов в системе Win-32. Оператор конкатенации строк, operator +, используется для конкатенации корня с суффиксом для генерации имен каталогов. Суффикс создается путем преобразования переменной управления циклом i в строку C ++ с использованием функции шаблона и объединения ее с другой строкой.

//Mark Renslow, Globe University, Minnesota School of Business, Utah Career College
//C++ instructor and Network Dean of Information Technology

#include <cstdlib>
#include <iostream>
#include <string>
#include <sstream> // string stream
#include <direct.h>

using namespace std;

string intToString(int x)
{
/**************************************/
/* This function is similar to itoa() */
/* "integer to alpha", a non-standard */
/* C language function. It takes an   */
/* integer as input and as output,    */
/* returns a C++ string.              */
/* itoa()  returned a C-string (null- */
/* terminated)                        */
/* This function is not needed because*/
/* the following template function    */
/* does it all                        */
/**************************************/   
       string r;
       stringstream s;

       s << x;
       r = s.str();

       return r;

}

template <class T>
string toString( T argument)
{
/**************************************/
/* This template shows the power of   */
/* C++ templates. This function will  */
/* convert anything to a string!      */
/* Precondition:                      */
/* operator<< is defined for type T    */
/**************************************/
       string r;
       stringstream s;

       s << argument;
       r = s.str();

       return r;

}

int main( )
{
    string s;

    cout << "What directory would you like me to make?";

    cin >> s;

    try
    {
      mkdir(s.c_str());
    }
    catch (exception& e) 
    {
      cerr << e.what( ) << endl;
    }

    chdir(s.c_str());

    //Using a loop and string concatenation to make several sub-directories
    for(int i = 0; i < 10; i++)
    {
        s = "Dir_";
        s = s + toString(i);
        mkdir(s.c_str());
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}
6
ответ дан 23 November 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: