解析输入c ++的行

Posted

技术标签:

【中文标题】解析输入c ++的行【英文标题】:parsing line of input c++ 【发布时间】:2014-04-17 08:03:38 【问题描述】:

我正在编写一个执行深度优先搜索的程序。是的,这是家庭作业,但我遇到的问题不是作业的学习点。我收到格式错误的输入,并且无法将输入分离为有效变量并存储它们。当我说格式错误的数据时,我的意思是有效数据之间没有特定数量的空格,并且每行的变量数不一致......试图找到一种更优雅的方式来获取我需要的数据而不是嵌套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;

样本输入:

11

Harry       Kate(18)       Fred(5)        Carol(6)
Alice      James(25)       Daisy(21)      Kate(10)
Carol     Fred(2)         Harry(6)       Daisy(12)
Ivy        James(16)       Bob(24)
Daisy       Carol(12)     Alice(21)     Elvis(28)
Elvis        James(18)       Daisy(28)      Fred(29)
Kate       Alice(10)      Fred(14)       Harry(18)    Gerald(20)
Fred        Kate(14)       Carol(2)     Harry(5)     Elvis(29)
Gerald      Kate(20)       Bob(17)    James(10)
James       Gerald(10)      Elvis(18)       Alice(25)   Ivy(16)
Bob     Ivy(24)        Gerald(17)

【问题讨论】:

数据是什么?字符串或整数或??? operator&gt;&gt; 将为您跳过所有前导空格(包括换行符),您只需关注值是否正确。 你想使用从当前行初始化的std::istringstream 为什么不给我们一个有代表性的实际输入部分以与您的代码交叉引用? 实际样本输入:11 Harry Kate(18) Fred(5) Carol(6) Alice James(25) Daisy(21) Kate(10) Carol Fred(2) Harry(6) Daisy( 12) Ivy James(16) Bob(24) Daisy Carol(12) Alice(21) Elvis(28) Elvis James(18) Daisy(28) Fred(29) Kate Alice(10) Fred(14) Harry(18)杰拉德(20) 弗雷德凯特(14) 卡罗尔(2) 哈利(5) 猫王(29) 杰拉德凯特(20) 鲍勃(17) 詹姆斯(10) 詹姆斯杰拉德(10) 猫王(18) 爱丽丝(25) 艾薇(16) ) 鲍勃·艾维(24) 杰拉德(17) 【参考方案1】:

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

#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;

【讨论】:

【参考方案2】:

也许你应该为每一行尝试 Boost:

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...

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

【讨论】:

我只被允许使用字符串和数组:/但是你所拥有的看起来像是完成我所追求的东西的好方法,正则表达式听起来很有趣。 (我发布了一种我发现如何将单词与行分开的方法,因为我是该网站的新手,所以我不让我发布自己的答案)。有没有办法解析出不涉及向量的“(#)”? 没有太多时间来回答,但您必须知道regex 用于字符串。如果您将所有单词都存储在某个地方(数组或其他),您可以使用该正则表达式检查每个单词中是否包含数字:[0-9]1,2。如果有匹配的内容,您将能够将其取回。

以上是关于解析输入c ++的行的主要内容,如果未能解决你的问题,请参考以下文章

CGAffineTransform 放射变换解析 即矩阵变换

C++ OBJ 解析器 - 第一次机会异常

矩阵链乘(解析表达式)

特殊字符的 XML 解析失败

Linux 0.11-解析并执行 shell 命令-45

Linux 0.11-解析并执行 shell 命令-45