字符串和数字的相互转换

注:

  1. 为了叙述的方便,以下数字均指整形,其它类型同样具有对应函数
  2. C语言的字符串是指字符数组,C++的字符串是指string,两者并不相同

C语言

字符串->数字

  • atoi(): 将字符串转换为整型值

int atoi(const char *nptr);

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char str[10];
    scanf("%s", str);

    int n;
    n = atoi(str);

    printf("%d\n", n);

    return 0;
}
  • sscanf(): 从字符串中读取
    该函数的作用类似正则表达式,可以格式化字符串
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char str[10];
    scanf("%s", str);

    int n;
    sscanf(str, "%d", &n);

    printf("%d", n);

    return 0;
}

数字->字符串

  • itoa():将整型值转换为字符串

char *itoa (int value, char *str, int base );
int value: 被转换的整数
char *string: 转换后储存的字符数组
int base: 转换进制数,如2,8,10,16 进制等,大小在2-36之间

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    scanf("%d", &n);

    char str[10];
    itoa(n, str, 10);

    printf("%s\n", str);

    return 0;
}
  • sprintf():将数字写入字符串中
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    scanf("%d", &n);

    char str[10];
    sprintf(str, "%d", n);

    printf("%s", str);
    return 0;
}

C++

getline(): Get line from stream into string(读入一行字符串(保留空格))

istream& getline (istream&  is, string& str, char delim);
遇到字符delim读入停止
istream& getline (istream&  is, string& str);

字符串->数字

istringstream

istringstream: 从string读取数据
使用标准的输出运算符(>>)从istringstream对象中以流的形式读取数据并存放入其它变量,读取操作实际转化为string的操作,所以这就是所谓的从string读取数据
此时并不需要考虑变量的类型,即>>右侧的变量可以为int类型,从而实现stringint的类型转换

#include <iostream>
#include <sstream>

using namespace std;

int main()
{
    string str;
    getline(cin, str);

    istringstream is(str);

    int p;
    while (is >> p) cout << p << ' ';

    return 0;
}

stringstream

stringstream:既可从string读数据,也可向string写数据
此时的‘读’与‘写’的概念与istringstreamostringstream完全相同,因此不再赘述

#include <iostream>
#include <sstream>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::stringstream;

int main()
{
    int p;
    string str;
    stringstream s;

    getline(cin, str);
    
    // 向string写入数据(由其它变量向stringstream写入数据)
    s << str;
    
    // 从string读取数据(从stringstream读取数据存入其它变量)
    while (s >> p) cout << p << ' ';

    return 0;
}

stox()

function instruction
stoi Convert string to integer
stol Convert string to long int
stoul Convert string to unsigned integer
stoll Convert string to long long
stoull Convert string to unsigned long long
stof Convert string to float
stod Convert string to double
stold Convert string to long double
#include <iostream>
#include <string>

using namespace std;

int main() {
  string n;
  cin >> n;
  cout << stoi(n) << endl;

  return 0;
}

数字->字符串

ostringstream

ostringstream: 向string写入数据
使用标准的输出运算符(<<)向ostringstream对象以流的形式写入数据,写入操作实际转化为string的操作,所以这就是所谓的向string写入数据
此时并不需要考虑写入string的数据是什么类型,即<<右侧的变量可以是int类型,从而实现intstring的类型转换

#include <iostream>
#include <sstream>

using namespace std;

int main()
{
    int p;
    ostringstream os;

    cin >> p;
    os << p;

    cout << os.str() << endl;

    return 0;
}

stringstream

#include <iostream>
#include <sstream>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::stringstream;

int main()
{
    int p;
    string str;
    stringstream s;

    cin >> p;
    
    // 向string写入数据(由其它变量向stringstream写入数据)
    s << p;
    
    // 从string读取数据(从stringstream读取数据存入其它变量)
    s >> str;

    cout << str << endl;

    return 0;
}

注: stringstream的复用问题

这个问题涉及到两个函数std::stringstream::str()std::ios::clear()


目前查询到的说法不一,暂不确定两个函数是否都需要使用,但测试结果是仅需要使用clear()即可达到复用的目的,但是是否会有其它问题还暂时没有验证

stringstream ss;
ss.str("");
ss.clear();

to_string()

#include <iostream>
#include <string>

using namespace std;

int main() {
  int n;
  cin >> n;
  cout << to_string(n) << endl;

  return 0;
}

posted @ 2021-05-07 21:18  0x7F  阅读(668)  评论(0编辑  收藏  举报