Integer to String C/C++

Модератор: Модераторы разделов

BratSinot
Сообщения: 812
ОС: Slackware64

Integer to String C/C++

Сообщение BratSinot »

Как цифру переделать в символ? Поясняю:

Код:

int tmp=2386; out << tmp;

Естественно он не выводит в текстовый файл число 2386. Как сделать так чтоб он вывел в текстовый файл "2386"?
Можно взять ASCII таблицу где '0'-48, '9'-57, но я не знаю как сделать чтоб он таким образом переделал число 55 в символ "55".
Спасибо сказали:
MrSinister
Сообщения: 95

Re: Integer to String C/C++

Сообщение MrSinister »

Код: Выделить всё

// переводит целое число в строку std::string
std::string itoa (int n) {

    char * s = new char[17];
    std::string u;

    // переводит в положительное число
    if (n < 0)
    {
        n = (-1 * n);
        u = "-"; // добавляет '-' в строку
    }

    int i=0;

    do
    {
        s[i++]= n%10 + '0'; // приведение каждой цифры в char
        n -= n%10; // обновление n
    }
    while ((n /= 10) > 0);

    for (int j = i-1; j >= 0; j--)
    {
        u += s[j]; // построение строки
    }

    delete[] s; // освобождение памяти
    return u;
}


BratSinot писал(а):
03.03.2010 23:13
Спасибо, работает.
//char * s = new char[17];
А зачем динамическая память?

Это же выигрыш в 17 байт, пусть уж при выполнении выделяются :D
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Integer to String C/C++

Сообщение Crazy »

Код: Выделить всё

#include <sstream>

template<typename T>
std::string tostring(const T& x)
{
  std::ostringstream out;
  out << x;
  return out.str( );
}

Desipere in loco
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Integer to String C/C++

Сообщение BratSinot »

MrSinister писал(а):
03.03.2010 23:06

Спасибо, работает.

//char * s = new char[17];
А зачем динамическая память?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Integer to String C/C++

Сообщение NickLion »

BratSinot писал(а):
03.03.2010 23:03
Как цифру переделать в символ? Поясняю:

Код:

int tmp=2386; out << tmp;

Естественно он не выводит в текстовый файл число 2386. Как сделать так чтоб он вывел в текстовый файл "2386"?

Как раз не естественно. Текстовый файл как открывали?
вот так всё в текстовом виде выходит:

Код: Выделить всё

#include <fstream>

int main() {
    std::fstream f( "file.txt", std::ios::out );
    int i = 2386;
    f << i;
    f.close();
    return 0;
}
Спасибо сказали:
Аватара пользователя
Wagan
Сообщения: 38
ОС: ALT Linux/FreeBSD/uCOS-II/Win

Re: Integer to String C/C++

Сообщение Wagan »

А что printf или sprintf отменили?
С уважением,
Ваган Саруханов
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Integer to String C/C++

Сообщение BratSinot »

Wagan писал(а):
09.03.2010 16:00
А что printf или sprintf отменили?

Мне нужно не для вывода на экран, а для вывода в файл.
Спасибо сказали:
Аватара пользователя
Wagan
Сообщения: 38
ОС: ALT Linux/FreeBSD/uCOS-II/Win

Re: Integer to String C/C++

Сообщение Wagan »

Воспользуйтесь всеми прелестями форматов в sprintf, выведите в буфер/переменную и затем в файл или еще куда нужно.

char buf[];
int tmp=3286;

sprintf(buf,"%d",tmp);
С уважением,
Ваган Саруханов
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Integer to String C/C++

Сообщение watashiwa_daredeska »

Wagan писал(а):
09.03.2010 16:40
char buf[];
int tmp=3286;

sprintf(buf,"%d",tmp);
А память в buf кто выделять будет? :)
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Integer to String C/C++

Сообщение BratSinot »

Wagan писал(а):
09.03.2010 16:40
Воспользуйтесь всеми прелестями форматов в sprintf, выведите в буфер/переменную и затем в файл или еще куда нужно.

char buf[];
int tmp=3286;

sprintf(buf,"%d",tmp);

Я помнится пробовал этот способ и он у меня почему-то не работал. Ладно завтра попробую и в книге Шилдта поковыряюсь еще раз.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Integer to String C/C++

Сообщение eddy »

BratSinot писал(а):
09.03.2010 19:45
Я помнится пробовал этот способ и он у меня почему-то не работал.

Потому и не работал, что память выделять надо:
либо

Код: Выделить всё

char buf[32];
int tmp=3286;
snprintf(buf, 31, "%d",tmp);

либо

Код: Выделить всё

char *buf = (char*)malloc(32);
int tmp=3286;
snprintf(buf, 31, "%d",tmp);

Цифру 32 я, конечно, от балды взял - надо посмотреть, сколько максимум места int может занять и не забыть прибавить 1 на завершающий символ 0.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Integer to String C/C++

Сообщение watashiwa_daredeska »

eddy писал(а):
09.03.2010 19:56
надо посмотреть, сколько максимум места int может занять и не забыть прибавить 1 на завершающий символ 0.
32-битный int = 10 цифр + знак + \0 = 12.
Спасибо сказали:
Аватара пользователя
Wagan
Сообщения: 38
ОС: ALT Linux/FreeBSD/uCOS-II/Win

Re: Integer to String C/C++

Сообщение Wagan »

Ребята, мы в теме "Погружение" -> "Программирование" или "В помощь начинающему"?

Я потому в размерности не поставил никаких цифирек, чтобы не было, как сказал коллега "от балды". Хотел поставить иксы, но посчитал, что это может вызвать больше флейма, а все равно напоролся. Если уйти от множества возможных вариантов, слов и обсуждений, то главное в моем предлоежении - не изобретать велосипед, а пользоваться существующими достижениями языка Си, а именно, форматтерами, что в Паскале, например, появилось на много позже. Это не оффтоп, я историческая справка, если автор темы захочет почитать вдруг Крнигана или Вирта, не приведи....
С уважением,
Ваган Саруханов
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Integer to String C/C++

Сообщение BratSinot »

eddy писал(а):
09.03.2010 19:56
Потому и не работал, что память выделять надо:
либо

Думаешь я совсем дурак чтоль? Был у меня этот масив определенным.
Спасибо сказали:
Аватара пользователя
Wagan
Сообщения: 38
ОС: ALT Linux/FreeBSD/uCOS-II/Win

Re: Integer to String C/C++

Сообщение Wagan »

BratSinot, все нормально, не нужно расстраиваться, просто часто собеседники не знают уровень компетенции спрашивающего, поэтому и возникают подобные вопросы и советы.
С уважением,
Ваган Саруханов
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Integer to String C/C++

Сообщение Crazy »

а чем шаблонная функция не подошла?

Desipere in loco
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Integer to String C/C++

Сообщение watashiwa_daredeska »

Wagan писал(а):
09.03.2010 21:17
Я потому в размерности не поставил никаких цифирек, чтобы не было, как сказал коллега "от балды". Хотел поставить иксы
Можно было поставить константу с говорящим именем, типа MAX_INTEGER_REPRESENTATION_CHARS.

Wagan писал(а):
09.03.2010 21:17
все равно напоролся
Потому что int buf[]; — синтаксически корректно, но логически ошибочно.
Спасибо сказали:
Аватара пользователя
Wagan
Сообщения: 38
ОС: ALT Linux/FreeBSD/uCOS-II/Win

Re: Integer to String C/C++

Сообщение Wagan »

watashiwa_darede..., рад, что мои предложения вызвали столько полезных советов с Вашей стороны, лишь бы они помогли автору темы.

Аригато годзаимас
С уважением,
Ваган Саруханов
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Integer to String C/C++

Сообщение eddy »

watashiwa_daredeska писал(а):
09.03.2010 22:34
Wagan писал(а):
09.03.2010 21:17
Я потому в размерности не поставил никаких цифирек, чтобы не было, как сказал коллега "от балды". Хотел поставить иксы
Можно было поставить константу с говорящим именем, типа MAX_INTEGER_REPRESENTATION_CHARS.

Мне тогда лень было в limits.h заглядывать. Сейчас глянул:

Код: Выделить всё

#  define INT_MAX       2147483647
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)

Re: Integer to String C/C++

Сообщение Voral »

eddy писал(а):
10.03.2010 00:49
Мне тогда лень было в limits.h заглядывать. Сейчас глянул:

Код: Выделить всё

#  define INT_MAX       2147483647

тогда уж лучше определять размер инта из кода ;) (sizeof())
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Integer to String C/C++

Сообщение watashiwa_daredeska »

Voral писал(а):
10.03.2010 08:52
тогда уж лучше
Чем лучше?
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Integer to String C/C++

Сообщение eddy »

Voral писал(а):
10.03.2010 08:52
тогда уж лучше определять размер инта из кода wink.gif (sizeof())

И вам будет ответ: 4 байта. Предлагаете потом 2 возводить в 63-ю степень? Или приближенно считать что один байт - три символа?
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)

Re: Integer to String C/C++

Сообщение Voral »

eddy писал(а):
10.03.2010 08:59
И вам будет ответ: 4 байта. Предлагаете потом 2 возводить в 63-ю степень? Или приближенно считать что один байт - три символа?

да действительно глупость сморозил. Но идея такова, что сделать универсально незавсимо от платформы и реализации.
ради интереса сейчас попробую :blush:
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Integer to String C/C++

Сообщение NickLion »

Тогда лучше использовать asprintf и не париться с выделением памяти :) Или самостоятельно реализовать аналогичное с выводом в /dev/null.

UPD вот нашёл когда-то делал:

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

FILE* dev_null = NULL;

int _vscprintf( const char* format, va_list argptr ) {
    if( !dev_null )
        dev_null = fopen( "/dev/null", "wb" );
    return vfprintf( dev_null, format, argptr );
}

char* alloc_sprintf( const char* Format, ... ) {
    va_list arg;
    va_start( arg, Format );
    int bl = _vscprintf( Format, arg ) + 1;
    va_end( arg );
    char* buf = (char*) malloc( bl );
    va_start( arg, Format );
    vsprintf( buf, Format, arg );
    va_end( arg );
    return buf;
}
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Integer to String C/C++

Сообщение watashiwa_daredeska »

Voral писал(а):
10.03.2010 09:38
идея такова, что сделать универсально незавсимо от платформы и реализации.
autotools?
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Integer to String C/C++

Сообщение eddy »

Voral писал(а):
10.03.2010 09:38
Но идея такова, что сделать универсально незавсимо от платформы и реализации.

Так все определения же перечислены в limits.h
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)

Re: Integer to String C/C++

Сообщение Voral »

eddy писал(а):
10.03.2010 09:56
Так все определения же перечислены в limits.h

да максимальные значения которые могут принимать переменные.
только теперь надо найти "посчитать" сколько символов в этом максимальном значении

Блин.... Чую решение на поверхности, а я лезу через тернии. :)
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Integer to String C/C++

Сообщение eddy »

Voral писал(а):
10.03.2010 10:04
Блин.... Чую решение на поверхности, а я лезу через тернии.

Мда, про посчитать я как-то не подумал... Значит, надо либо брать логарифм, либо вычислять 2^TYPE_MAX, либо брать заведомо больший буфер, закидывать в него sprintf'ом TYPE_MAX и вычислять длину полученной строки, а потом удалять буфер и создавать уже нужных размеров.

Кстати, есть еще такой вариант: strlen("TYPE_MAX"); может быть даже сработает.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Integer to String C/C++

Сообщение eddy »

Есть:

Код: Выделить всё

#include <stdio.h>
#include <string.h>
#include <limits.h>
#define MAXLEN_(arg) strlen(#arg)
#define MAXLEN(arg) MAXLEN_(arg)
main(){
    printf("max length of int = %d, INT_MAX=%d\n", MAXLEN(INT_MAX), INT_MAX);
    printf("max length of short = %d, SHRT_MAX=%d\n", MAXLEN(SHRT_MAX), SHRT_MAX);
}


Код: Выделить всё

./a.out
max length of int = 10, INT_MAX=2147483647
max length of short = 5, SHRT_MAX=32767
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
Wagan
Сообщения: 38
ОС: ALT Linux/FreeBSD/uCOS-II/Win

Re: Integer to String C/C++

Сообщение Wagan »

Коллеги, а для чего, собственно, так сильно заморачиваться и путать автора темы? Разве задача пишется под ДОС, где каждый байт на счету? Лучше ввести переменную buf (имя неважно), размерностью с запасом на всё, что в коде еще может встретиться в будущем, чтобы в эту переменную можно было и стринги с пояснениями помещать. Поэтому и была предложена функция с форматтером, которая позволит добавлять пояснения, а не сухие цифры, например, для удобства "разбора полетов":

sprintf(buf,"В этом месте программы пременная tmp имеет значение %d",tmp);
С уважением,
Ваган Саруханов
Спасибо сказали: