Поиск по этому блогу

понедельник, 3 августа 2009 г.

Преобразование числа в строку и обратно на C++ под Linux

По непонятной мне причине(или я ошибаюсь) в Linux отсутствует функция itoa - пробразование числа в строку,
хотя и реализована atoi - преобразование строки в число.
Для пробразования числа в строку рекомендутся использовать sprintf, как описано тут http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/

/* sprintf example */
#include <stdlib.h>
int main ()
{
char buffer [50];
int n, a=5, b=3;
n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);
printf ("[%s] is a %d char long string\n",buffer,n);
return 0;
}

Но мне этот метод не очень нравится из-за громоздкости и надобности помнить кучю параметров.
Поэтому для себя сделал простенький файл, из найденного на просторах инета:

(листинг stringconvert.h)

#ifndef _STRINGCONVERT_H
#define _STRINGCONVERT_H
#include <string>
#include <sstream>

template <typename T>
std::string toString(T val)
{
std::ostringstream oss;
oss<< val;
return oss.str();
}

template <typename T>
T fromString(const std::string& s)
{
std::istringstream iss(s);
T res;
iss >> res;
return res;
}

#endif /* _STRINGCONVERT_H */

А использовать его очень просто:

(листинг main.cpp)

#include <stdlib.h>
#include "stringconvert.h"
#include <string.h>
#include <iostream>
/*
*
*/
using namespace std;

int main(int argc, char** argv)
{
//convert numbers to string
int i = 1234;
float f = 1234.12;
double d = -345.67;

string s_i = toString(i);
string s_f = toString(f);
string s_d = toString(d);

//print numbers converted to strings
cout << "Integer to string: " << s_i << endl;
cout << "Float to string: " << s_f << endl;
cout << "Double to string: " << s_d << endl << endl;

//convert string to numbers

string s_ii = "456";
string s_ff = "456.678";
string s_dd = "-890.45";

int ii = fromString<int>(s_ii);
float ff = fromString<float>(s_ff);
double dd = fromString<double>(s_dd);

//print strings converted to numbers
cout << "String to integer: " << ii << endl;
cout << "String to float: " << ff << endl;
cout << "String to double: " << dd << endl;

return (EXIT_SUCCESS);
}

Вывод программы:

Integer to string: 1234
Float to string: 1234.12
Double to string: -345.67

String to integer: 456
String to float: 456.678
String to double: -890.45

Преобразование происходит при помощи шаблонов
функций(о том, что это такое можно глянуть тут http://programmersclub.ru/29/ )

При преобразовании любого чисельного типа к строке можно не указывать из какого типа происходит преобразование, а вот из строки в число указывать нужно, что и видно в листинге.

1 комментарий:

  1. А так не пробовали:

    char s[10];//для знакового 4-байтного целого

    sprintf(s, "%d", n);

    ?

    ОтветитьУдалить