Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.75
pro_xaoc
0 / 0 / 0
Регистрация: 24.03.2010
Сообщений: 53
#1

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

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

Приветствую всех! Господа, помогите освоить конвертацию типов. Знаю, что такие темы не раз поднимались, но прочитав их чего-то недопонял (ибо я новичок). Многие советуют использовать 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2010, 12:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конвертирование из float в str и наоборот (C++):

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

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

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

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

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing - C++
#include<stdio.h> #include<stdlib.h> #include<math.h> float f1(float x)/*vira*enie 1*/ {return (x*cos(x))/(1+ pow(x,2));} ...

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

16
papochka
33 / 33 / 2
Регистрация: 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
Fenrir1
2 / 2 / 1
Регистрация: 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
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,849
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
papochka
33 / 33 / 2
Регистрация: 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
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,849
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
pro_xaoc
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
papochka
33 / 33 / 2
Регистрация: 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
pro_xaoc
0 / 0 / 0
Регистрация: 24.03.2010
Сообщений: 53
13.10.2010, 14:52  [ТС] #9
Друзья, ну что с моим вопросом?
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,849
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
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
13.10.2010, 15:33 #11
Ммм, я наверное более точно сформулирую вопрос:
Как из переменной типа float сделать переменную char и наоборот\
0
pro_xaoc
0 / 0 / 0
Регистрация: 24.03.2010
Сообщений: 53
13.10.2010, 15:39  [ТС] #12
Цитата Сообщение от LineStown Посмотреть сообщение
Ммм, я наверное более точно сформулирую вопрос:
Как из переменной типа float сделать переменную char и наоборот\
ну хотя бы и так.
0
papochka
33 / 33 / 2
Регистрация: 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/2c17712d6fb204a885574db991fffc3b вроде работает..

хм.. можно лаконичней.. sprintf'ом?
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,849
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
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
13.10.2010, 16:16 #15
easybudda, Спасибо пример хороший, а как быть когда длина char не известна, а используется указатель?
0
13.10.2010, 16:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2010, 16:16
Привет! Вот еще темы с ответами:

Как заставить Strncpy вложить в itog часть символов строки str, если дина str больше, чем кол-во нужных нам символов? - C++
strncpy(itog,str,size+1); cout&lt;&lt;itog; itog вообще не выводится Добавлено через 2 минуты Вот код. #include &lt;iostream&gt; ...

Чем отличаются float преобразования (float)var от float(var) - C++
Здравствуйте! Подскажите, чем отличается (float)var от float(var)

cannot convert `float' to `float*. Почему так происходит? - C++
всем привет, помогите исправить ошибки... а то голова мало варит уже, а завтра надо сдать уже #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt;...

invalid types `float[float]' for array subscript - C++
void SEARCH(float vol, float price, int i) { if (i&gt;N) { if(price&gt;maxprice) { ...


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

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

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