例如,字符串 "2679" 就不是一个数字:它是由 2、6、7、9 这 4 个字符的 ASCII 码组成的序列。由于字符串 "2679" 不是一个数字,所以编译器将不允许对它进行加法、乘法和除法之类的数学运算。以数字表示的字符串必须首先转换为数字形式,然后才能与算术运算符一起使用。
同样地,数字形式的程序值,例如 int、long 和 double 等,有时也需要转换为字符串形式,这样结果字符串才能立即输出到文件或其他输入输出设备,或者存入内存中的某个字符串对象,供以后使用。
当用户在键盘上输入一个数字时,该数字以字符串的形式输入,就好像用户输入的一系列字符(数字)。在 C++ 中,这样的数字通常通过流提取运算符 >> 来读取。在存储到数字类型的变量之前,该运算符会根据需要自动执行转换。在输出期间,数字到字符串的反向转换由流输出运算符 << 执行。
使用字符串流对象进行数字转换
C++ 有两个类,ostringstream 和 istringstream,可以用来对内存中的值执行字符串/数字转换。
ostringstream 类是 ostream 的子类(cout 也属于该类),并使用流插入运算符 << 将数值转换为字符串。ostringstream 类型对象的工作方式与cout和文件对象的工作方式相同,但它不是将数据写入屏幕或文件,而是写入它所包含的字符串对象中。
每次在 ostringstream 对象上使用 << 时,它都会执行必要的数字到字符串的转换,并将结果追加到其字符串的末尾。除了支持 ostream 类的所有成员函数和运算符外,ostringstream 对象还支持表 1 中所示的 str 成员函数。
istringstream 类是从 istream 派生的。它内部包含一个字符串对象,函数将它作为可以从中"读取"的输入流。
输入流可以在创建对象时由 istringstream 构造函数设置,也可以在创建对象后通过调用 str(string s) 函数来设置。流提取操作符 >> 从封闭的字符串中读取,并在必要时将字符串转换为数字。表 1 列出了 istringstream 的成员函数,必须在程序中包含 sstream
头文件才能使用这些类。
成员函数 | 描 述 |
---|---|
istringstream(string s) |
istringstream 的构造函数:设置对象的输入流的初始值。示例: istringstream istr ("50 64 28"); |
ostringstream(string s) |
ostringstream 的构造函数:设置对象的输出流的初始值。示例: ostringstream ostr("50 64 28"); |
string str() |
返回 ostringstream 或 istringstream 对象中包含的字符串。示例: string is = istr.str(); string os = ostr.str (); |
void str(string &s) |
设置作为对象的输入或输出流的字符串。示例: ostr.str ("50 64 28"); istr.str("50 64 28"); |
下面的程序演示了这些类的用法:
//This program illustrates the use of sstream objects #include <sstream> #include <iostream> #include <string> using namespace std; int main() { string str = "John 20 50"; // string to read from const char *cstr = "Amy 30 42"; // Cstring to read from istringstream istr1 (str); // istr1 will read from str istringstream istr2; // istr2 will read from cstr ostringstream ostr; // The ostringstream object to write to string name; int score1, score2, average_score; // Read name and scores and compute average then write to ostr istr1 >> name >> score1 >> score2; average_score = (score1 + score2)/2; ostr << name << " has average score" << average_score << "/n"; // Set istr2 to read from the C string and repeat the above istr2.str(cstr); istr2 >> name >> score1 >> score2; average_score = (score1 + score2)/2; ostr << name << " has average score" << average_score << "/n"; // Switch to hexadeximal output on ostr ostr << hex; // Write Amy's scores in hexadecimal ostr << name << "'s scores in hexadecimal are: " << score1 << " and " << score2 << "/n"; // Extract the string from ostr and print it to the screen cout << ostr.str(); return 0; }
程序输出结果:
John has average score35
Amy has average score36
Amy's scores in hexadecimal are: 1e and 2a
请注意,这些类具有 ostream 和 istream 对象的全部功能,包括使用八进制和十六进制等不同进制将数字转换为字符串的能力。当然,它们也是有缺陷的,它们强制程序员创建 sstream 对象,只有这样才能使用它们的插入和提取运算符执行转换。
数字转换函数
C++ 11 提供了若干 to_string(T value) 函数来将 T 类型的数字值转换为字符串形式。以下是几个 to_string() 函数的列表:
string to_string(int value)
string to_string(long value)
string to_string(double value)
来看以下代码示例:
int a = 5; string str = to_string(a*a); cout << " The square of 5 is " << str << endl;
以上示例即显示了该系列函数的用法。它将打印如下字符串:
The square of 5 is 25
to_string() 函数无法处理非十进制整数的转换。如果需要该功能,则应该使用 ostringsteam 对象来完成该转换。
字符串到数字的转换可以通过 stoX() 系列函数来执行。该系列函数的成员可以将字符串转换为 int、long、float 和 double 类型的数字。具体语法如下所示:
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)
第一个形参 str 是一个字符串(例如 "-342" 或 "3.48" 等),它将被转换为恰当的数字形式。这些函数可以将 str 可能的最长前缀转换为数字,并返回一个整数地址 pos,pos 中保存了 str 无法被转换的第一个字符的索引。类型 size_t 是在标准库中定义的,常用于表示无符号整数的大小或数组、矢量、字符串中的一个索引。
例如,如果试图转换字符串 "-34iseven",则将成功返回整数 -34,而无法转换的第一个字符的位置 pos 则被设置为 3。base 形参仅适用于整数转换,指示用于转换的进制。pos 和 base 形参都是可选的,所以它们可以被忽略。如果 pos 被忽略,则不会存储停止字符的索引。如果 base 被忽略,则默认为十进制。如果字符串 str 包含一个无效值,例如 "is-34 even?",则不会进行转换,函数将抛出一个 invalid_argument 异常。
下面的程序演示了字符串转换函数的用法:
// This program demonstrates the use of the stoXXX() // numeric conversion functions. #include <string> #include <iostream> using namespace std; int main() { string str; // string to convert size_t pos; // Hold position of stopping character //Convert string to double str = "-342.57is a number"; cout << "The string is " << str << endl; double d = stod(str, &pos); cout << "The converted double is " << d << endl; cout << "The stopping character is " << str[pos] << " at position " << pos << endl; // Convert string to int (default to decimal) str = "-342.57is a number"; cout << "/nThe string is " << str << endl; int i = stoi(str, &pos); cout << "The converted integer is " << i << endl; cout << "The stopping character is " << str[pos] <<" at position " << pos << endl; // Convert string to int (base is binary) str = "01110binary number"; cout << "/nThe string is " << str << endl; i = stoi (str, &pos, 2); cout << "The converted binary integer is " << i << endl; cout << "The stopping character is " << str[pos] << " at position " << pos << endl; return 0; }
程序输出结果:
The string is -342.57is a number
The converted double is -342.57
The stopping character is i at position 7
The string is -342.57is a number
The converted integer is -342
The stopping character is . at position 4
The string is 01110binary number
The converted binary integer is 14
The stopping character is b at position 5
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/21220.html