进制转换
两个数字字符串转换
目标:把一个x进制的数字符串转换成y进制字符串;
说明:先把x进制的数转换为十进制,再将十进制数不断取模再倒序,转换成y进制;
实现代码:
std::string transform(int x, int y, std::string s) {
std::string res = "";
int sum = 0;
for (int i = 0; i < s.length(); i++) {
if (s[i] == '-' || s[i] == 'x') continue;
if (s[i] >= '0' && s[i] <= '9') {
sum = sum * x + s[i] - '0';
} else {
sum = sum * x + s[i] - 'A' + 10;
}
}
while (sum) {
char tmp = sum % y;
sum /= y;
if (tmp <= 9) {
tmp += '0';
} else {
tmp = tmp - 10 + 'A';
}
res = tmp + res;
}
if (res.length() == 0) res = "0";
if (s[0] == '-') res = '-' + res;
return res;
}
使用sprintf
使用sprintf和sprintf_s函数;
int sprintf(char *string, char *format [,argument,...]);
其中format如下:
%d 整数转成十进位。
%f 倍精确度数字转成浮点数。
%o 整数转成八进位。
%s 字符串输出到缓冲区,不转换。
%x 整数转成小写十六进位。
%X 整数转成大写十六进位。
使用CString的Format函数
%c:单个字符
%d:十进制整数(int)
%ld:十进制整数(long)
%f:十进制浮点数(float)
%lf:十进制浮点数(double)
%o:八进制数
%s:字符串
%u:无符号十进制数
%x:十六进制数
使用std::to_string函数
可以使用to_string对各种整型、浮点数等值转换为string字符串;
字符串转换数值
atof:字符串转换为float类型;
atoi:字符串转换为int类型;
atol和atoll:字符串转换为long类型或long long类型;
也可以stoX() 系列函数来执行。该系列函数的成员可以将字符串转换为 int、long、float 和 double 类型的数字。
注意:整数地址 pos中保存了 str 无法被转换的第一个字符的索引。
int stoi(const strings str, size_t* pos = 0, int base = 10)
long stol(const strings str, size_t* pos = 0, int base = 10)
float stof(const strings str, size_t* pos = 0)
double stod(const strings str, size_t* pos = 0)
使用ostringstream和istringstream
C++的ostringstream和istringstream可以用来对内存中的值执行字符串/数字转换。
ostringstream 类使用流插入运算符 << 将数值转换为字符串。ostringstream 类型对象的工作方式与cout和文件对象的工作方式相同,但它不是将数据写入屏幕或文件,而是写入它所包含的字符串对象中。
每次在 ostringstream 对象上使用 << 时,它都会执行必要的数字到字符串的转换,并将结果追加到其字符串的末尾。除了支持 ostream 类的所有成员函数和运算符外,ostringstream 对象还支持表 1 中所示的 str 成员函数。
istringstream 类内部包含一个字符串对象,函数将它作为可以从中"读取"的输入流。
输入流可以在创建对象时由 istringstream 构造函数设置,也可以在创建对象后通过调用 str(string s) 函数来设置。流提取操作符 >> 从封闭的字符串中读取,并在必要时将字符串转换为数字。表 1 列出了 istringstream 的成员函数,必须在程序中包含 sstream 头文件才能使用这些类。
注意:ostringstream和istringstream强制程序员创建 sstream 对象,只有这样才能使用它们的插入和提取运算符执行转换。