字符串和数字的相互转换
注:
- 为了叙述的方便,以下数字均指整形,其它类型同样具有对应函数
- 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
类型,从而实现string
向int
的类型转换
#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写数据
此时的‘读’与‘写’的概念与istringstream
和ostringstream
完全相同,因此不再赘述
#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
类型,从而实现int
向string
的类型转换
#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;
}