Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/26: Рейтинг темы: голосов - 26, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 24.03.2010
Сообщений: 53
1

Конвертирование из float в str и наоборот

13.10.2010, 12:23. Показов 5264. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую всех! Господа, помогите освоить конвертацию типов. Знаю, что такие темы не раз поднимались, но прочитав их чего-то недопонял (ибо я новичок). Многие советуют использовать atoi, scanf и т.д., но не знаю как их применять. Вот например:
C++
1
2
3
4
5
float a;
string str="exit";
cin >> a;
if (a==str) exit(1);
else ... ля-ля-ля-тополя
Теперь тут ошибка выходит, что нет конвертации. Вот теперь, как можно конвертировать из string в float, из float в string? Раньше я программировал на дельфи, там всё просто было, IntToStr или StrToFloat и т.д. Нет ли такого в С++? Буду очень благодарен за любую помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2010, 12:23
Ответы с готовыми решениями:

Str в long double и наоборот
Пользуюсь Microsoft Visual Studio 2010 там такой "_atold()" функции нет. Пробовал "atof()" но она...

Конвертирование float/int to string
Здравствуйте, я пишу программу на dev-c++ и мне надо конвертировать число в string.Я просто не знаю...

Equal(str.begin(), str.end(), str.rbegin()
#include <iostream> #include <string> using namespace std; string str; int main() {...

Функции str.size() и str.length() - в чем их разница?
Существует 2 функции для определения размера строки в string str.size() и str.length() В чем их...

16
33 / 33 / 0
Регистрация: 14.11.2009
Сообщений: 137
13.10.2010, 12:38 2
C++
1
2
3
char,string... YorString = "...";
float Temp;
Temp = static_cast<float>(YorString);

Для вашего случая:
C++
1
2
3
4
5
6
float a;
string str="exit";
a = static_cast<float>(str);
cin >> a;
if (a==str) exit(1);
else ... ля-ля-ля-тополя
Наоборот, думаю, сделаете?
0
2 / 2 / 2
Регистрация: 13.10.2010
Сообщений: 6
13.10.2010, 12:40 3
попробуйте так:
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 <string>
#include <iostream>
#include <sstream>
 
using namespace std;
 
template<class T> T fromString(const string& s)
{
    istringstream iss(s);
    T res;
    iss >> res;
    return res;
}
 
int main()
{
    string s = "123.123";
    int i = fromString<int>(s);
    double d = fromString<double>(s);
    float f = fromString<float>(s);  
    cout << i << endl;
    cout << d << endl;
    cout << f << endl;  
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
13.10.2010, 13:20 4
pro_xaoc, а с какой целью Вы для ввода слова тип float используете? float и double используются для хранения вещественных чисел разной степени точности. Если задача - читать строку ввода, проверять, не содержит ли она команду exit, и если не содержит, интерпретировать ввод, как вещественное число, то вот например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <sstream>
 
int main(){
    std::string buf;
    double val;
 
    while ( std::cout << "> " && std::cin >> buf && buf != "exit" ){
        std::istringstream ist(buf);
        ist.exceptions(std::istringstream::failbit);
        try {
            ist >> val;
        }
        catch ( std::istringstream::failure e ){
            std::cerr << "Wrong input!" << std::endl;
            continue;
        }
        std::cout << "Value is " << val << std::endl;
    }
 
    return 0;
}
1
33 / 33 / 0
Регистрация: 14.11.2009
Сообщений: 137
13.10.2010, 13:42 5
Цитата Сообщение от easybudda Посмотреть сообщение
pro_xaoc, а с какой целью Вы для ввода слова тип float используете? float и double используются для хранения вещественных чисел разной степени точности. Если задача - читать строку ввода, проверять, не содержит ли она команду exit, и если не содержит, интерпретировать ввод, как вещественное число, то вот например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <sstream>
 
int main(){
    std::string buf;
    double val;
 
    while ( std::cout << "> " && std::cin >> buf && buf != "exit" ){
        std::istringstream ist(buf);
        ist.exceptions(std::istringstream::failbit);
        try {
            ist >> val;
        }
        catch ( std::istringstream::failure e ){
            std::cerr << "Wrong input!" << std::endl;
            continue;
        }
        std::cout << "Value is " << val << std::endl;
    }
 
    return 0;
}
easybudda, А через static_cast не получится перевести, как я выше написал?

Что-то прошелся по инету, не приветствуют этот способ...
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
13.10.2010, 14:00 6
Цитата Сообщение от papochka Посмотреть сообщение
А через static_cast не получится перевести, как я выше написал?
Не, так не получится
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <string>
 
int main(){
    std::string str("12.34");
    double val = static_cast<double>(str);
    std::cout << val << std::endl;
 
    return 0;
}
Код
$ g++ -o double_cast double_cast.cpp 
double_cast.cpp: In function 'int main()':
double_cast.cpp:6: error: invalid static_cast from type 'std::string' to type 'double'
Цитата Сообщение от papochka Посмотреть сообщение
не приветствуют этот способ...
Какой из них? Как я написал? Чем аргументируют?
1
0 / 0 / 0
Регистрация: 24.03.2010
Сообщений: 53
13.10.2010, 14:00  [ТС] 7
Цитата Сообщение от Fenrir1 Посмотреть сообщение
попробуйте так:
C++
1
pro_xaoc, а с какой целью Вы для ввода слова тип float используете? float и double используются для хранения вещественных чисел разной степени точности. Если задача - читать строку ввода, проверять, не содержит ли она команду exit, и если не содержит, интерпретировать ввод, как вещественное число
дело в том, что я создаю на С++ калькулятор (все наверное создавали, когда начинали изучать). Так вот, тип флоат я использую для того, чтобы принимать цифры с клавы и походу проверить, если там вместо цифр идет exit, то условие выполняется и прога завершается. Ну вот собственно сам код:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <cstring>
using namespace std;
 
int main()
{
    float a,b,c;
    int y;
    char znak;
    string z="exit";
    setlocale(LC_ALL,"Russian");
    cout << "\t\t\t     Добро пожаловать! \n";
    cout << "\t\t\t Калькулятор 1.0 by pro_xaoc \n \n";
    Sleep(1000);
    cout << "Загрузка ";
    for (y=0; y<5; y++) 
    { 
        cout << ".";
        Sleep(1000);
    }
    cout << "\rДля завершения программы наберите exit.\n";
    cout << "Применимые операции: + - * / \n";
    cout << "Введите два числа: ";
    cin >> a >> b;
    if (a==z)
    {
        exit(1);
    }
    else
    {
    cout << "Теперь введите знак нужной вам операции \n";
    cin >> znak;
    switch (znak)
    {
        case '+':
            c=a+b;
            break;
        case '-':
            c=a-b;
            break;
        case '/':
            c=a/b;
            break;
        case '*':
            c=a*b;
            break;
    }
    cout << "Ответ: " << a << znak << b << " = " << c; 
    Sleep(5000);
    }
    return 0;
}
Вот так вот.
А через static_cast не получится перевести, как я выше написал?
Что-то прошелся по инету, не приветствуют этот способ...
чето ошибка выходит:
Код
static_cast: невозможно преобразовать 'std::string' в 'float'
        Для выполнения данного преобразования нет доступного оператора преобразования, определенного пользователем, или вызов оператора невозможен
0
33 / 33 / 0
Регистрация: 14.11.2009
Сообщений: 137
13.10.2010, 14:07 8
Цитата Сообщение от easybudda Посмотреть сообщение
Не, так не получится
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <string>
 
int main(){
    std::string str("12.34");
    double val = static_cast<double>(str);
    std::cout << val << std::endl;
 
    return 0;
}
Код
$ g++ -o double_cast double_cast.cpp 
double_cast.cpp: In function 'int main()':
double_cast.cpp:6: error: invalid static_cast from type 'std::string' to type 'double'

Какой из них? Как я написал? Чем аргументируют?
нет. тот, что я привел...

Добавлено через 5 минут
извините.. по неопытности..
0
0 / 0 / 0
Регистрация: 24.03.2010
Сообщений: 53
13.10.2010, 14:52  [ТС] 9
Друзья, ну что с моим вопросом?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
13.10.2010, 15:27 10
pro_xaoc, так вроде ответил - если читаете из ввода число, не пытайтесь его со строкой сравнивать...
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <string>
#include <sstream>
 
int main(){
    std::string buf;
    double firstOperand, secondOperand, result;
    char action;
 
    while ( std::cout << "> " && std::getline(std::cin, buf) && buf != "exit" ){
        std::istringstream ist(buf);
        ist.exceptions(std::istringstream::failbit);
        try {
            ist >> firstOperand >> action >> secondOperand;
        }
        catch ( std::istringstream::failure e){
            std::cerr << "Wrong input!" << std::endl;
            continue;
        }
        switch ( action ){
        case '+' :
            result = firstOperand + secondOperand;
            break;
        case '-' :
            result = firstOperand - secondOperand;
            break;
        case '*' :
            result = firstOperand * secondOperand;
            break;
        case '/' :
            if ( secondOperand == 0.0 ){
                std::cerr << "Dividion by 0 not allowed!" << std::endl;
                result = 0;
            }
            else
                result = firstOperand / secondOperand;
            break;
        }
        std::cout << "Result: " << result << std::endl;
    }
 
    return 0;
}
Код
~/cpp/numbers $ g++ -o simple_calc simple_calc.cpp 
~/cpp/numbers $ ./simple_calc 
> 45 + 5
Result: 50
> 13+1
Result: 14
> 18 / 5
Result: 3.6
> 8 / 0
Dividion by 0 not allowed!
Result: 0
> exit
~/cpp/numbers $
0
72 / 71 / 8
Регистрация: 04.08.2010
Сообщений: 434
13.10.2010, 15:33 11
Ммм, я наверное более точно сформулирую вопрос:
Как из переменной типа float сделать переменную char и наоборот\
0
0 / 0 / 0
Регистрация: 24.03.2010
Сообщений: 53
13.10.2010, 15:39  [ТС] 12
Цитата Сообщение от LineStown Посмотреть сообщение
Ммм, я наверное более точно сформулирую вопрос:
Как из переменной типа float сделать переменную char и наоборот\
ну хотя бы и так.
0
33 / 33 / 0
Регистрация: 14.11.2009
Сообщений: 137
13.10.2010, 15:46 13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
here is an example of std::stringstream:
 
#include <string>
#include <sstream>
#include <iostream>
 
std::string float_to_str(float f)
{
std::stringstream stream;
stream << f;
return stream.str();
}
 
int main()
{
std::cout << float_to_str(123.67898f) << std::endl;
return 0;
}
вот что-то нагуглил..

http://liveworkspace.org/code/... b991fffc3b вроде работает..

хм.. можно лаконичней.. sprintf'ом?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
13.10.2010, 15:54 14
pro_xaoc, Вам Fenrir1 функцию написал, возвращающую из строки данные разных типов, я Вам калькулятор написал, Вы ответы читаете?

Цитата Сообщение от LineStown Посмотреть сообщение
Как из переменной типа float сделать переменную char и наоборот
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
 
#define STR_LEN 32
 
int main(void){
    double val = 3.14;
    char buf[STR_LEN] = { 0 };
 
    snprintf(buf, STR_LEN, "%f", val);
    printf("As string: %s\n", buf);
    printf("As number: %f\n", atof(buf));
 
    return 0;
}
2
72 / 71 / 8
Регистрация: 04.08.2010
Сообщений: 434
13.10.2010, 16:16 15
easybudda, Спасибо пример хороший, а как быть когда длина char не известна, а используется указатель?
0
0 / 0 / 0
Регистрация: 24.03.2010
Сообщений: 53
13.10.2010, 16:33  [ТС] 16
easybudda, спасибо большое и извини, я не заметил ...
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
13.10.2010, 17:23 17
Цитата Сообщение от LineStown Посмотреть сообщение
а как быть когда длина char не известна, а используется указатель?
Есть gnu-шная функция asprintf(), но не факт, что в мелкомягких компиляторах будет работать.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
 
int main(void){
    double val = 3.14;
    char * buf;
 
    if ( asprintf(&buf, "%f", val) == -1 ){
        perror("asprintf");
        return 1;
    }
    printf("As string: %s\n", buf);
    printf("As number: %f\n", atof(buf));
    free(buf);
 
    return 0;
}
0
13.10.2010, 17:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2010, 17:23
Помогаю со студенческими работами здесь

Функция: по заданной строке Str сформулировать новую строку, состоящую только из цифр, входящих в Str
Написать и протестировать функцию,которая по заданной строке Str формулирует новую строку,состоящую...

как создать функцию или программу, чтобы str состояла из цифр,а также давалась новой строке str
как создать функцию или программу, чтобы str состояла из цифр,а также давалась новой строке str

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing
#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;math.h&gt; float f1(float x)/*vira*enie 1*/ ...

Написать и протестировать функцию, которая по заданной строке Str формирует новую строку, состоящую только из цифр, входящих в Str
Помогите ребят!!!!препод задачи дал для аттестации,сделал фактически все,кроме этой: &quot;Написать и...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru