在C++中,可以使用 std::istringstream
从 std::string
中读取单词。首先,需要包含 <sstream>
和 <vector>
头文件。示例代码如下:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
int main() {
string line;
getline(std::cin, line); // 读取一行
istringstream iss(line);
vector<std::string> words;
string word;
while (iss >> word) {
words.push_back(word);
}
// 打印单词
for (const string &w : words) {
cout << w << endl;
}
int number;
cin >> number; // 读取一个数字
cout << "Number: " << number << endl;
return 0;
}
这个例子首先使用 getline
从 cin
读取一行文本,然后创建一个 istringstream
对象,用于从该行中提取单词。我们将单词存储在一个 vector<string>
中。接下来,我们使用 cin
读取一个整数。
在这个例子中,我们假设输入的单词和数字之间用换行符分隔。
也可以使用 while (cin >> string)
这种形式直接从输入流中读取单词。但是,这种方法在遇到换行符(例如用户按下 Enter 键)时不会停止。因此,如果你想在读取一行输入中的所有单词后,再读取一个数字,你需要做一些额外的处理。
以下是一个示例,展示了如何实现这个功能:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
vector<string> words;
string s;
// 读取单词,直到遇到换行符或文件结束
while (cin.peek() != '\n' && cin >> s) {
words.push_back(s);
}
// 忽略换行符
cin.ignore();
// 打印单词
for (const string &w : words) {
cout << w << endl;
}
int number;
cin >> number; // 读取一个数字
cout << "Number: " << number << endl;
return 0;
}
在这个例子中,我们使用 cin.peek()
来检查输入流中的下一个字符,如果它不是换行符('\n'),我们就继续读取单词。在读取完一行输入中的所有单词后,我们使用 cin.ignore()
忽略换行符,然后再读取一个数字。
也可以使用cin.get(char)
函数来手工处理包含空白字符(如空格、制表符和换行符)在内的所有字符,下面是cin >> char
和cin.get(char)
的主要区别:
空白字符处理:cin >> char
会自动忽略空白字符(如空格、制表符和换行符),直到遇到一个非空白字符。而 cin.get(char)
不会忽略空白字符,它会读取第一个可用的字符,即使这个字符是空白字符。
函数形式:cin >> char
是 istream
类中 operator>>
的一个重载版本,通常用于读取各种基本数据类型(如整数、浮点数、字符等)。而 cin.get(char)
是 istream
类的一个成员函数,专门用于从输入流中读取字符。
下面是两个例子,分别展示了 cin >> char
和 cin.get(char)
的用法:
#include <iostream>
using namespace std;
int main() {
char s1;
cin >> s1; // 会忽略空白字符
cout << "s1: " << s1 << endl;
char s2;
cin.get(s2); // 不会忽略空白字符
cout << "s2: " << s2 << endl;
return 0;
}
假设用户输入为(下划线表示空格):
____A__B
程序的输出将会是:
s1: A
s2:
但是,如果将 cin >> s1
替换为 cin.get(s1)
,程序的输出将会是:
s1:
s2:
这样的输出显示了 get(s)
不会忽略空白字符的特点。