C++读取一行多个单词的方法

信息学奥赛   2023-11-13 16:24   300   0  

在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 >> charcin.get(char)的主要区别:

  1. 空白字符处理cin >> char 会自动忽略空白字符(如空格、制表符和换行符),直到遇到一个非空白字符。而 cin.get(char) 不会忽略空白字符,它会读取第一个可用的字符,即使这个字符是空白字符。

  2. 函数形式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) 不会忽略空白字符的特点。