Форум программистов, компьютерный форум CyberForum.ru

Ищу код перевода числа в строку и назад... - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
AKE
11 / 11 / 0
Регистрация: 09.05.2010
Сообщений: 384
09.02.2012, 22:27     Ищу код перевода числа в строку и назад... #1
itoa и atoi не подходят...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2012, 22:27     Ищу код перевода числа в строку и назад...
Посмотрите здесь:

C++ Программа перевода числа из 10 СС в 2 СС
Подскажите с кодом перевода числа в восьмеричную сисему C++
Программа перевода числа из десятичной системы в восмеричную C++
Не работает код (программа считывает из файла строку, убирает лишние пробелы и записывает в другой файл строку, словами наоборот) C++
C++ Перевод перевода целого числа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
09.02.2012, 22:45     Ищу код перевода числа в строку и назад... #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <sstream>
#include <iostream>
 
int main()
{
    std::string s("10.66");
    double num;
    std::stringstream ss;
    ss << s;
    ss >> num;
    ss.clear();
    std::cout << "num returns "<< num << std::endl;;
    num = 100.9;
    ss << num;
    ss >> s;
    std::cout << "s returns "<< s << std::endl;
    return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2012, 10:44     Ищу код перевода числа в строку и назад... #3
Цитата Сообщение от AKE Посмотреть сообщение
itoa и atoi не подходят...
- пробуй
C++
1
2
3
4
5
6
7
8
char buf[32];
int val;
cout<<"Enter number : ";
cin>>val;
sprintf(buf,"%d",val);
int ret;
sscanf(buf,"%d",&ret);
cout<<ret<<endl;
для работы необходимо подключить <stdio.h> для Си и <cstdio> для С++ и не городи велосипед с использованием stringstream...
Bers
Заблокирован
10.02.2012, 10:51     Ищу код перевода числа в строку и назад... #4
Юра, сложность в том, что sscanf оперирует целыми, либо float.
Он не умеет работать с double. Из-за этого досадного обстоятельства, не всегда подходит.
А для float, всякие специализированные atof работают быстрее, чем универсальный sscanf
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2012, 10:52     Ищу код перевода числа в строку и назад... #5
Вот и сам код, его достоинство в том что без особых изменений им можно пользоваться как в Си так и С++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
    int iVal;
    double dVal;
    char buf[256];
    cout<<"Enter integer : ";
    cin>>iVal;
    cout<<"Enter double  : ";
    cin>>dVal;
    sprintf(buf,"%d %lf",iVal,dVal);
    cout<<"String : "<<buf<<endl;
    iVal = 0;
    dVal = 0;
    sscanf(buf,"%d %lf",&iVal,&dVal);
    cout<<"GetVal :\n"
        <<"integer : "<<iVal<<endl
        <<"double  : "<<dVal<<endl;
    system("pause");
    return 0;
}
Миниатюры
Ищу код перевода числа в строку и назад...  
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2012, 10:55     Ищу код перевода числа в строку и назад... #6
Цитата Сообщение от Bers Посмотреть сообщение
Юра, сложность в том, что sscanf оперирует целыми, либо float.
Он не умеет работать с double. Из-за этого досадного обстоятельства, не всегда подходит.
А для float, всякие специализированные atof работают быстрее, чем универсальный sscanf
- да неужели???
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
sprintf(buf,"%d %lf",iVal,dVal);
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
sscanf(buf,"%d %lf",&iVal,&dVal);
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2012, 11:00     Ищу код перевода числа в строку и назад... #7
Bers, ну так как, чё молчишь то???
Код Си для большего понимания что может scanf а что нет...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
int main()
{
    int iVal    = 0;
    double dVal = 0;
    char buf[256];
    printf("Especialy for Bers\n");
    printf("Enter integer : ");
    scanf("%d",&iVal);
    printf("Enter double  : ");
    scanf("%lf",&dVal);
    sprintf(buf,"%d %lf",iVal,dVal);
    printf("String : %s\n",buf);
    iVal = 0;
    dVal = 0;
    sscanf(buf,"%d %lf",&iVal,&dVal);
    printf
    (
        "GetVal :\n"
        "integer : %d"
        "double  : %lf",
        iVal,dVal
    );
    getchar();
    return 0;
}
Миниатюры
Ищу код перевода числа в строку и назад...  
Bers
Заблокирован
10.02.2012, 11:34     Ищу код перевода числа в строку и назад... #8
Вот щас проверил:

C++
1
2
double dVal=123456.123456789; char buf[256]; 
    sprintf(buf,"%lf",dVal); //123456.123457
Похоже, что "%lf" интерпретируется как самый обыкновенный float...
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2012, 11:38     Ищу код перевода числа в строку и назад... #9
Цитата Сообщение от Bers Посмотреть сообщение
Похоже, что "%lf" интерпретируется как самый обыкновенный float...
- об этом уже велась речь на форуме, найду ссылку - сброшу...

Добавлено через 1 минуту
Цитата Сообщение от Bers Посмотреть сообщение
Ээээ... какой такой мой scanf? О чем речь вообще?
- посчитал что ставишь float т.к. на старых компиляторах double val;scanf("%lf",&val); без начального инита вылетает...
Bers
Заблокирован
10.02.2012, 11:45     Ищу код перевода числа в строку и назад... #10
Кстати, stringstream имеет такие же сложности с double.

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

_fcvt_s
_gcvt_s

Вообще, их там целое семейство разных. Но мне вот этих двух за глаза хватило.
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2012, 11:54     Ищу код перевода числа в строку и назад... #11
Цитата Сообщение от Bers Посмотреть сообщение
имеет такие же сложности с double.
пока ищу почитай здесь
http://stackoverflow.com/questions/2...ay-with-just-f

Because C will promote floats to doubles for functions that take variable arguments. Pointers aren't promoted to anything, so you should be using %lf or %g to read in doubles.
Добавлено через 17 секунд
Хотя я сейчас и за lf найду...

Добавлено через 4 минуты
Bers, вот тут чёрным по белому написано

http://www.dgp.toronto.edu/~ajr/209/notes/printf.html

Footnote: In printf(), the rvalue type promotions are expected. Thus %c actually corresponds to a parameter of type int and %f and %g actually correspond to parameters of type double. Thus in printf() there is no difference between %f and %lf, or between %g and %lg. However, in scanf() what is passed is a pointer to the variable so no rvalue type promotions occur or are expected. Thus %f and %lf are quite different in scanf, but the same in printf.
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2012, 12:00     Ищу код перевода числа в строку и назад... #12
Вот и скрин в потдверждение - scanf парсит всё число, всё дело в выводе
Миниатюры
Ищу код перевода числа в строку и назад...  
Bers
Заблокирован
10.02.2012, 12:05     Ищу код перевода числа в строку и назад... #13
так и я тоже в отладчике смотрел
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2012, 12:09     Ищу код перевода числа в строку и назад... #14
Цитата Сообщение от Bers Посмотреть сообщение
так и я тоже в отладчике смотрел
- ну и что тебе не нравится?
Bers
Заблокирован
10.02.2012, 12:16     Ищу код перевода числа в строку и назад... #15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- ну и что тебе не нравится?
Мне не нравится:

C++
1
2
double dVal=123456.123456789; char buf[256]; 
    sprintf(buf,"%lf",dVal); //123456.123457
Что в буфер он записал весьма весьма округленное число.
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2012, 12:58     Ищу код перевода числа в строку и назад... #16
Цитата Сообщение от Bers Посмотреть сообщение
Что в буфер он записал весьма весьма округленное число.
-

Bers, мне порядком поднадоела наша дискуссия, для тебя и для всех читающих код
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
int main()
{
    int iVal    = 0;
    double dVal = 0;
    char buf[256];
    printf("Especialy for Bers\n");
    printf("Enter integer : ");
    scanf("%d",&iVal);
    printf("Enter double  : ");
    scanf("%lf",&dVal);
    sprintf(buf,"%d %.11f",iVal,dVal);
    printf("String : %s\n",buf);
    iVal = 0;
    dVal = 0;
    sscanf(buf,"%d %lf",&iVal,&dVal);
    printf
    (
        "GetVal :\n"
        "integer : %d"
        "double  : %.11f",
        iVal,dVal
    );
    getchar();
    return 0;
}
PS:Bers, для тебя ещё раз объясняю - в
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
scanf("%lf",&dVal);
ключ lf имеет значение, в printf вывод дефалтится до 6-й цифр после запятой т.е. до float если надо больше цифирей вывести - юзай соотвествующий спецификатор вывода...
Пост 12 ещё раз для понимания
Миниатюры
Ищу код перевода числа в строку и назад...  
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2012, 13:01     Ищу код перевода числа в строку и назад... #17
Конечно смело пишу, но предлагаю администрации вынести код выше пост 17 в раздел часто рассматриваемых вопросов, т.к. невыносимо каждый раз чиать, а почему printf округляет, а почему в scanf ключ lf чувствуется а в printf нет, ИМХО взяли погуглили и не терзайте людям нервы...
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2012, 13:17     Ищу код перевода числа в строку и назад... #18
Т.к. всерьёз думаю что ко мне прислушаются, вот более менее подправленный код и тест, а то по предыдущему тесту всё не достаточно прозрачно видно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
 
int main()
{
    int iVal    = 0;
    double dVal = 0;
    char buf[256];
    printf("Especialy for Bers\n");
    printf("Enter integer : ");
    scanf("%d",&iVal);
    printf("Enter double  : ");
    scanf("%lf",&dVal);
    sprintf(buf,"%d %.11f",iVal,dVal);
    printf("String : %s\n",buf);
    iVal = 0;
    dVal = 0;
    getchar();
    sscanf(buf,"%d %lf",&iVal,&dVal);
    printf
    (
        "GetVal :\n"
        "integer : %d\n"
        "double  : %.11f\n",
        iVal,dVal
    );
    getchar();
    return 0;
}
Миниатюры
Ищу код перевода числа в строку и назад...  
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.02.2012, 22:15     Ищу код перевода числа в строку и назад... #19
Цитата Сообщение от Bers Посмотреть сообщение
Похоже, что "%lf" интерпретируется как самый обыкновенный float...
у double есть экспоненциальная форма, у float таковая отсутствует
http://liveworkspace.org/code/3dcad3...7eb8c7926b9d4b

Добавлено через 5 минут
Цитата Сообщение от AKE Посмотреть сообщение
itoa и atoi не подходят...
обоснуй почему не подходят?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2012, 22:54     Ищу код перевода числа в строку и назад...
Еще ссылки по теме:

C++ Алгоритм перевода шестнадцатеричного числа в десятичный код
C++ Есть ли более удобный способ перевода переменную в строку?
Ввести в программу строку (числа, латиница), считать только числа, записать числа в массив C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.02.2012, 22:54     Ищу код перевода числа в строку и назад... #20
Цитата Сообщение от Bers Посмотреть сообщение
Что в буфер он записал весьма весьма округленное число.
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main(void){
    double dVal=123456.123456789; char buf[256]; 
        sprintf(buf,"%.9lf",dVal); //123456.123457 - да ну?!
    printf("%s\n", buf);
    
    return 0;
}
Код
~/cpp/numbers $ gcc -o double double.c 
~/cpp/numbers $ ./double
123456.123456789
~/cpp/numbers $
Инструкции внимательнее читать надо.
Yandex
Объявления
10.02.2012, 22:54     Ищу код перевода числа в строку и назад...
Закрытая тема Создать тему
Опции темы

Текущее время: 16:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru