C++ 解析输入c+的行+;

C++ 解析输入c+的行+;,c++,string,parsing,C++,String,Parsing,我正在写一个程序做深度优先搜索。是的,这是作业,但我有问题的部分不是作业的学习点。我收到的输入格式不正确,无法将输入分离为有效变量并存储它们。当我说格式不好的数据时,我的意思是在有效数据之间没有特定数量的空格,并且每行的变量数不一致。。。试图找到一种更优雅的方式来获取我需要的数据,而不是一套3个循环。非常感谢您的帮助。 我当前的代码: int main() { //read in first line (# of lines WITH data) cout << &q

我正在写一个程序做深度优先搜索。是的,这是作业,但我有问题的部分不是作业的学习点。我收到的输入格式不正确,无法将输入分离为有效变量并存储它们。当我说格式不好的数据时,我的意思是在有效数据之间没有特定数量的空格,并且每行的变量数不一致。。。试图找到一种更优雅的方式来获取我需要的数据,而不是一套3个循环。非常感谢您的帮助。 我当前的代码:

int main()
{
    //read in first line (# of lines WITH data)
    cout << "enter the number of lines\n";
    cin >> lines;

    //if non integer entered it won't error now
    while(!cin)
    {
        cin.clear(); // clears the error flags
        cin.ignore(20, '\n'); //flush the buffer
        cout <<"\ndid not enter a valid integer, please try again\n\n";
        //reprompt for VALID input
        cout << "enter the number of lines\n";
        cin >> lines;
    }
    //lines should now have a valid int input value

    //eat blank line
    getline(cin,str);


    //read in (# of lines WITH data retrieved from first input)
    for(int i = 0; i < lines; i++)
    {
        getline(cin, str);// read first string
        //process str
        //while not end of line
        //{
    
        //breakup line into individual variables
        std::string delim = " "; //set space as a delimiter
        size_t pos = 0;
        string token;
        while ((pos = str.find(delim)) != std::string::npos)
        {
            token = str.substr(0,pos);
            //set token to variable that increases (array location?)

            //get char, loop to check if chare = " ", eat it if it is until its not

        }
        //}

        //place variables in array location
        //...
    }
    //eat blank line at end of data set
    getline(cin,str);

    //alphabetize array
    // ...

    return 0;
}

您可以使用std::istringstream和std::istream_迭代器标记每一行。下面给出了一个示例代码

#include <iostream>
#include <iterator>
#include <vector>
#include <string>
#include <sstream>

template <typename T>
std::vector<T> parse_line(const std::string& s) {
  std::vector<T> result;
  std::istringstream iss(s);
  std::copy(std::istream_iterator<T>(iss), std::istream_iterator<T>(),
            std::back_inserter(result));
  return result;
}

int main() {
  std::string s{"Harry       Kate(18)       Fred(5)        Carol(6)"};
  auto r = parse_line<std::string>(s);
  for (auto const& e : r) std::cout << e << std::endl;
  return 0;
}
#包括
#包括
#包括
#包括
#包括
模板
std::vector parse_行(const std::string&s){
std::向量结果;
标准:istringstream iss;
std::copy(std::istream_迭代器(iss),std::istream_迭代器(),
标准:背向插入器(结果);
返回结果;
}
int main(){
std::字符串s{“哈里·凯特(18)弗雷德(5)卡罗尔(6)”;
自动r=解析_行;

对于(auto const&e:r)std::cout也许您应该尝试一下Boost,对于每一行:

string myline = "Harry       Kate(18)       Fred(5)";
vector<string> result;
boost::split(result, myline, boost::is_any_of(" "));

然后你需要遍历这个向量,我建议你使用
regex
查看每个字符串是否包含括号。然后你可以得到名称和数字。

数据是什么?字符串或int或???
运算符>
将跳过所有前导空格(包括换行符)对于您来说,您只需要关注值是否正确。您希望使用从当前行初始化的
std::istringstream
。为什么不给我们一个实际输入的代表性部分,以便与您的代码进行交叉引用?实际示例输入:11 Harry Kate(18)Fred(5)Carol(6)Alice James戴西·凯特·卡罗尔·弗雷德哈利·戴西·艾薇·詹姆斯鲍勃·黛西·卡罗尔爱丽丝·埃尔维斯·詹姆斯艾维斯弗雷德凯特·爱丽丝弗雷德哈里·杰拉尔德弗雷德·凯特卡罗尔哈里·艾维斯(29)杰拉尔德·凯特(20)鲍勃(17)詹姆斯(10)詹姆斯·杰拉尔德(10)埃尔维斯(18)爱丽丝(25)艾薇(16)鲍勃·艾薇(24)杰拉尔德(17)我只允许使用字符串和数组:/但你那里的东西看起来是完成我所追求的目标的好方法,正则表达式听起来很有趣。(我发布了一个我发现如何将单词与行分开的方法,因为我是该网站的新手,所以不允许我发布我自己的答案)。有没有办法解析出不涉及向量的“(#)”?没有多少时间来回答,但你必须知道
regex
用于字符串。如果你把所有单词都存储在某个地方(数组或其他),您可以检查每个正则表达式中是否都有数字,例如:
[0-9]{1,2}
。如果有匹配项,您将能够取回它。
string myline = "Harry       Kate(18)       Fred(5)";
vector<string> result;
boost::split(result, myline, boost::is_any_of(" "));
 result[0] = Harry
 result[1] = Kate(18)
 result[2] = Fred(5)
 etc...