Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/10: Рейтинг темы: голосов - 10, средняя оценка - 5.00
AKE
11 / 11 / 3
Регистрация: 09.05.2010
Сообщений: 384
1

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

09.02.2012, 22:27. Просмотров 1854. Ответов 21
Метки нет (Все метки)

itoa и atoi не подходят...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2012, 22:27
Ответы с готовыми решениями:

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

Есть ли более удобный способ перевода переменную в строку?
Всем привет, начнем: Есть переменная(которая может быть и переменной и...

Программа перевода числа из 10 СС в 2 СС
У Дейтлов есть задача: Они предлагают следующие инструкции по переводу...

Перевод перевода целого числа
Суть такая: Имеется целое число(цифра), его надо преобразовать в символ(2 в...

Программа для перевода числа
Не могу написать программу для перевода числа, введенного пользователем из P...

21
igorrr37
1867 / 1483 / 751
Регистрация: 21.12.2010
Сообщений: 2,473
Записей в блоге: 11
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;
}
2
-=ЮрА=-
Заблокирован
Автор 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...
0
Bers
Заблокирован
10.02.2012, 10:51 4
Юра, сложность в том, что sscanf оперирует целыми, либо float.
Он не умеет работать с double. Из-за этого досадного обстоятельства, не всегда подходит.
А для float, всякие специализированные atof работают быстрее, чем универсальный sscanf
0
-=ЮрА=-
Заблокирован
Автор 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;
}
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);
0
-=ЮрА=-
Заблокирован
Автор 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;
}
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...
0
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2012, 11:38 9
Цитата Сообщение от Bers Посмотреть сообщение
Похоже, что "%lf" интерпретируется как самый обыкновенный float...
- об этом уже велась речь на форуме, найду ссылку - сброшу...

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

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

_fcvt_s
_gcvt_s

Вообще, их там целое семейство разных. Но мне вот этих двух за глаза хватило.
0
-=ЮрА=-
Заблокирован
Автор 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.
0
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2012, 12:00 12
Вот и скрин в потдверждение - scanf парсит всё число, всё дело в выводе
0
Миниатюры
Ищу код перевода числа в строку и назад...  
Bers
Заблокирован
10.02.2012, 12:05 13
так и я тоже в отладчике смотрел
0
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2012, 12:09 14
Цитата Сообщение от Bers Посмотреть сообщение
так и я тоже в отладчике смотрел
- ну и что тебе не нравится?
0
Bers
Заблокирован
10.02.2012, 12:16 15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- ну и что тебе не нравится?
Мне не нравится:

C++
1
2
double dVal=123456.123456789; char buf[256]; 
    sprintf(buf,"%lf",dVal); //123456.123457
Что в буфер он записал весьма весьма округленное число.
0
-=ЮрА=-
Заблокирован
Автор 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 ещё раз для понимания
0
Миниатюры
Ищу код перевода числа в строку и назад...  
-=ЮрА=-
Заблокирован
Автор FAQ
10.02.2012, 13:01 17
Конечно смело пишу, но предлагаю администрации вынести код выше пост 17 в раздел часто рассматриваемых вопросов, т.к. невыносимо каждый раз чиать, а почему printf округляет, а почему в scanf ключ lf чувствуется а в printf нет, ИМХО взяли погуглили и не терзайте людям нервы...
0
-=ЮрА=-
Заблокирован
Автор 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;
}
1
Миниатюры
Ищу код перевода числа в строку и назад...  
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.02.2012, 22:15 19
Цитата Сообщение от Bers Посмотреть сообщение
Похоже, что "%lf" интерпретируется как самый обыкновенный float...
у double есть экспоненциальная форма, у float таковая отсутствует
http://liveworkspace.org/code/3dcad347ab1b1a23cd7eb8c7926b9d4b

Добавлено через 5 минут
Цитата Сообщение от AKE Посмотреть сообщение
itoa и atoi не подходят...
обоснуй почему не подходят?
0
easybudda
Модератор
Эксперт CЭксперт С++
10105 / 6014 / 1507
Регистрация: 25.07.2009
Сообщений: 11,402
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 $
Инструкции внимательнее читать надо.
0
10.02.2012, 22:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2012, 22:54

Не могу понять этот код перевода с двоичной системы в десятичную, обьясните пожалуйста
int biennial_transformer(void) { char ch; long long n; do...

Ввести в программу строку (числа, латиница), считать только числа, записать числа в массив
Нужна помощь! Срочно! Нужно ввести в программу строку (числа, латиница),...

Программа перевода числа из 10ой системы в двоичную
Сам код: #include &lt;iostream&gt; using namespace std; int main() { long int i;...


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

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru