在getline()

时间:2018-03-28 12:09:49

标签: c++ getline

我想要一个带空格的字符串,因此我使用了getline()但是之后我想得到另一个字符串(没有空格),如果有一个-e,那么后面的字符串{ {1}},但是因为在我的代码中,我在使用s2时失去了冲刺,我似乎无法实现我想要做的事情。任何建议都会非常有用。

getline()

}

6 个答案:

答案 0 :(得分:1)

更好的选择是对getline()进行一次调用,然后解析“command”字符串。从简单的split()开启“ - ”或find('-')

,有很多方法可以实现这一目标

答案 1 :(得分:1)

getline()从is中提取字符并将其存储到str中,直到找到分隔字符delim或换行符'\n'

如果找到分隔符,它将被提取并丢弃(即不存储它,下一个输入操作将在它之后开始)。

答案 2 :(得分:0)

解析参数的方式当然可以改进,但这个答案与此无关。我认为你要找的是在var reg = new RegExp("[&?]list=([a-z0-9_]+)","i"); var url = 'https://www.youtube.com/playlist?list=PLcfQmtiAG0X-fmM85dPlql5wfYbmFumzQ'; var match = reg.exec(url); return match[1]; 删除它之后简单地将-字符串放回流中。在这种情况下,您可以使用std::getline方法

.putback()

答案 3 :(得分:0)

我将在这里做一些假设:

  1. 你永远不会期待一个' \ n'除了在输入字符串的末尾,即使在" -b"之后(您的代码目前将在其中读取)
  2. 您希望只接受每种类型的参数中的一种(因为您当前的代码会踩踏任何先前的条目)
  3. regex_search可以很好地处理regex

    (?:\s*-f\s+(\w+)|\s*-b\s+([^-]+)|\s*-e\s+(\w+))*
    

    Live Example

    您需要先从cin读取变量,例如string input。这可以这样做:

    getline(cin, input)
    

    输入后,您可以执行以下操作:

    if(smatch m; regex_search(input, m, regex{ "(?:\\s*-f\\s+(\\w+)|\\s*-b\\s+([^-]+)|\\s*-e\\s+(\\w+))*" })) {
        if(m[1].length() > 0U) {
            cout << "-f " << m[1] << endl;
        }
    
        if(m[2].length() > 0U) {
            cout << "-b " << m[2] << endl;
        }
    
        if(m[3].length() > 0U) {
            cout << "-e " << m[3] << endl;
        }
    }
    

    Live Example

答案 4 :(得分:0)

如果您在整行中阅读,并且您不想使用Boost程序选项或getopts,您可以自己解析该行(如建议的那样)。这将是一种方法,作为代码中动态解析的替代方法:

#include <iostream>
#include <string>
#include <tuple>
#include <vector>

using std::cout;
using std::endl;
using std::get;
using std::literals::string_literals::operator""s;
using std::make_tuple;
using std::string;
using std::tuple;
using std::vector;

static auto chunkLine(string const& line)
{
  auto result = vector<string>{};
  auto i = string::size_type{};
  while (i != string::npos && i < line.size())
  {
    auto pos = line.find(" -", i);
    auto count = pos == string::npos ? pos : (pos - i);
    result.push_back(line.substr(i, count));
    i = pos + (pos != string::npos ? 1 : 0);
  }
  return result;
}

static auto parseChunks(vector<string> const& chunks)
{
  auto result = vector<tuple<string, string>>{};
  for (auto const& chunk : chunks)
  {
    auto pos = chunk.find(" ");
    if (pos != string::npos && chunk[0] == '-')
    {
      auto kv = make_tuple(chunk.substr(1, pos-1), chunk.substr(pos+1));
      result.push_back(kv);
    }
  }
  return result;
}

int main()
{
  auto line = "-f name -b blah blah -e email"s;
  auto keyValueTuples = parseChunks(chunkLine(line));
  for (auto const& kv : keyValueTuples)
  {
    cout << get<1>(kv) << endl;
  }
}

答案 5 :(得分:0)

我认为你应该在输入getline之前输入cin.ignore,如代码所示:

`string s,s1,s2;
char check_character;

while (cin.peek() != '\n')
 {
    if (cin.get() == '-')
 {
    check_character = cin.get();
    switch(check_character)
    {
        case 'f':
        cin >> s;
        break;
        case 'b':
        if(cin.peek() != '\n')
            cin.ignore
            getline(cin, s1, '-');
        else if(cin.peek() =='\n')
            cin.ignore
            getline(cin, s1);
        break;
        case 'e':
        cin>> s2;
        break;
    }
}
}
cout << s << endl << s1 << endl << s2 << endl;
return 0; `