【问题标题】:Extraction for second word. Parsing strings (C++)提取第二个单词。解析字符串 (C++)
【发布时间】:2025-12-08 22:55:02
【问题描述】:

我正在尝试去掉逗号,将第二个单词存入secondWord,然后输出secondWord

我的代码:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main() 
{
    istringstream inSS;       
    string lineString;        
    string firstWord;         
    string secondWord;       
    int i;
    bool correct = false;

    cout << "Enter input string:" << endl;

    while (!correct) 
    {
        // Entire line into lineString
        getline(cin, lineString);

        // Copies to inSS's string buffer
        inSS.clear();
        inSS.str(lineString);

        // Now process the line
        inSS >> firstWord;

        // Output parsed values
        if (firstWord == "q")
        {
            cout << "q" << endl;
            correct = true;
        }

        inSS >> secondWord;
        if(secondWord[i] != ',')
        {
            cout<<"Error: No comma in string."<<endl;
        }

        else if (secondWord[i] == ',')
        {

            cout << "First word: " << firstWord << endl;
            cout << "Second word: " << secondWord << endl;
            cout << endl;
        }
    }

    return 0;
}

可接受的输入: 吉尔,艾伦 吉尔,艾伦 吉尔,艾伦

expected output

代码生成逗号作为第二个单词,但我想去掉逗号和空格并去掉第二个单词。

【问题讨论】:

  • 好像 i 未初始化
  • 无论如何,你可以看看这个问题:*.com/questions/53849/… 来了解如何标记一个字符串。
  • 如果 i 未初始化,代码行为将未定义,因此任何事情都可能发生。无论如何,您应该向我们提供一个示例输入,a, ba , ba,b 使用您的代码可能会产生非常不同的结果。
  • 问题是当你inSS &gt;&gt; firstWord; 当你的输入是Jill, Allen 时,你也会接受逗号,所以逗号不应该出现在你的第二个单词中,因此会出现错误。转到我之前发布的链接以了解如何标记字符串。
  • 我读过tokenize,但我们还没有在课堂上学过,必须坚持使用涵盖的材料。

标签: c++ string parsing iostream cout


【解决方案1】:
vector<string> tokenize(const string& line, const string& delimiters)
{
    int start = 0, end = 0;
    vector<string> result;
    while (end != string::npos)
    {
        start = line.find_first_not_of(delimiters, end);
        end = line.find_first_of(delimiters, start);
        if (start != string::npos && end != string::npos)
            result.push_back(line.substr(start, end - start));
        else if (start != string::npos)
            result.push_back(line.substr(start));
        else
            break;
    }
    return result;
}

此方法返回由分隔符分隔的标记。如果您的分隔符是", ",那么您需要额外检查以确保中间有逗号。如果你的分隔符是",",你会想要在每个单词的开头和结尾剪掉一些空格。

【讨论】: