字符串与整型、浮点型数据之间的转换

C/C++ 专栏收录该内容
3 篇文章 0 订阅


      最近遇到的一道题。其中用到了将字符串转化为float类型,在很多题中都可能要求输入数据,但考虑到可能存在输入异常,不能直接利用整型或浮点型存储,第一步都是先使用字符串或者字符型数组,将符号和数字统一看作字符进行存储。引例如下:

PAT 1054(求平均值)

在这里插入图片描述
在这里插入图片描述

题解

      题目核心是要判断输入是否合法。当前字符不是数字不是小数点也不是符号时,直接非法;负号出现在非首位非法;小数点数目大于1非法;小数位数大于2非法;转化后的浮点数不在区间[-1000,1000]内非法。除此之外,合法。
      在上题的输入示例1中,如果直接将数据输入进float型变量中,那么aaa就无法判别异常,但如果使用字符型存储,对于合法数据,参加运算时还要作为浮点型数据进行求取平均值,因此需要利用到stod()函数进行类型转换。

#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
bool check_legal(string s) {
    int pnum = 0, ppos;
    for (int i = 0; i < s.size(); ++i) {
        if ((s[i] < '0' || s[i] > '9') && (s[i] != '.' && s[i] != '-'))
            return false;
        if (s[i] == '-' && i != 0) return false;
        if (s[i] == '.') {
            pnum++;
            if (pnum > 1) return false;
            ppos = i;
        }
    }
    if (pnum > 0 && ppos < s.size() - 3) return false;
    if (stod(s) > 1000.0 || stod(s) < -1000.0)
        return false;
    else
        return true;
}

int main() {
    int n, cnt = 0;
    double sum = 0.0;
    string s;
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        cin >> s;
        if (!check_legal(s))
            cout << "ERROR: " << s << " is not a legal number" << endl;
        else {
            cnt++;
            sum += stod(s);
        }
    }
    if (cnt == 0)
        printf("The average of 0 numbers is Undefined");
    else if (cnt == 1)
        printf("The average of %d number is %.2lf", cnt, sum);
    else
        printf("The average of %d numbers is %.2lf", cnt, sum / cnt);
    return 0;
}

类型转换函数

字符串转化为其他类型

函数名含义
stoistring to int
stodstring to double
stofstring to float
stolstring to long
stoldstring to long double
stollstring to long long

注:
【1】在这里插入图片描述
【2】stoi()等函数属于C++11中的特性,在Devc++中要使用这类函数,需要先修改编译标准,步骤如下。
在这里插入图片描述
示例:

#include<iostream>
using namespace std;
int main(){
	string s = "2020.525";
	int a = stoi(s);
	double b = stod(s);
	float c = stof(s);
	int d = a + 1;
	cout<<a<<endl;
	cout<<b<<endl;
	cout<<c<<endl;
	cout<<d<<endl;
	return 0;
}

运行结果:
在这里插入图片描述

其他类型转化为字符串

函数原型:

string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);

功能:
将数值转化为字符串。返回对应的字符串。
示例:

#include <iostream>   
#include <string>     
using namespace std;
int main(){
    string pi = "pi is " + std::to_string(3.1415926);
    string perfect = to_string(1 + 2 + 4 + 7 + 14) + " is a perfect number";
    cout << pi << '\n';
    cout << perfect << '\n';
    return 0;
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页

打赏作者

永远的小铮铮

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值