Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;字符串流忽略()不工作_C++_Stringstream - Fatal编程技术网

C++ C++;字符串流忽略()不工作

C++ C++;字符串流忽略()不工作,c++,stringstream,C++,Stringstream,我在解决一个关于hackerrank的问题时遇到了这个涉及字符串流的问题 对于提取数据,hackerrank给出了一个示例: stringstream ss("23,4,56"); char ch; int a, b, c; ss >> a >> ch >> b >> ch >> c; // a = 23, b = 4, c = 56 但是,当我尝试将其导出到向量时,我必须使用以下方法来避开该选项: stringstream ss

我在解决一个关于hackerrank的问题时遇到了这个涉及字符串流的问题

对于提取数据,hackerrank给出了一个示例:

stringstream ss("23,4,56");
char ch;
int a, b, c;
ss >> a >> ch >> b >> ch >> c;  // a = 23, b = 4, c = 56
但是,当我尝试将其导出到向量时,我必须使用以下方法来避开该选项:

stringstream ss(str);
vector<int> vect;
int i;

while (ss >> i)
{
vect.push_back(i);

if (ss.peek() == ',')
    ss.ignore();
}
stringstreamss(str);
向量向量;
int i;
while(ss>>i)
{
向量推回(i);
如果(ss.peek()==',')
忽略();
}

为什么我不能在这里使用提取操作来获取所需的单词?流是否应该转义“,”(很抱歉出现noob级别的问题)?

操作符>
仅当字符实际属于请求的数据类型时,才提取下一个带分隔符的标记。因此,当使用
操作符>
读取
int
时,它将只提取数字,而不是字母、标点符号等。这意味着必须单独读取数字后面的逗号

在第一个示例中:

  • ss>>a
    读取流中的第一个
    int
  • 然后,
    >ch
    读取它后面的逗号
  • 然后
    >b
    读取下一个
    int
  • 然后,
    >ch
    读取它后面的逗号
  • 然后
    >c
    读取下一个
    int
  • 在第二个例子中:

  • ss>>i
    读取流中的下一个
    int
    ,如果失败或EOF,则中断循环
  • 然后
    ss.peek()
  • 后藤1号
  • 如果尝试使用
    运算符>>
    读取不存在的逗号,它将设置流的
    eofbit
    状态并使提取失败。如果使用
    while(ss>>i>>ch)
    while
    将在达到最后一个
    int
    时计算为
    false
    。即使
    ss>>i
    会成功,
    >ch
    也会失败,因此
    i
    不会被添加到
    向量中


    理论上,如果(ss.peek()==',')ss.ignore(),您可以替换
    在循环内,使用
    字符ch;ss>>ch
    取而代之。至少对于像
    “23,4,56”
    这样的字符串,结束效果是相同的。但是,假设你得到了类似于“23 4 56”
    的东西。第一个示例无法正确处理该问题,但第二个示例在使用
    peek()+ignore()
    时处理得很好,但在使用
    ss>>ch

    operator>
    时处理得不好,仅当字符实际属于请求的数据类型时。因此,当使用
    操作符>
    读取
    int
    时,它将只提取数字,而不是字母、标点符号等。这意味着必须单独读取数字后面的逗号

    在第一个示例中:

  • ss>>a
    读取流中的第一个
    int
  • 然后,
    >ch
    读取它后面的逗号
  • 然后
    >b
    读取下一个
    int
  • 然后,
    >ch
    读取它后面的逗号
  • 然后
    >c
    读取下一个
    int
  • 在第二个例子中:

  • ss>>i
    读取流中的下一个
    int
    ,如果失败或EOF,则中断循环
  • 然后
    ss.peek()
  • 后藤1号
  • 如果尝试使用
    运算符>>
    读取不存在的逗号,它将设置流的
    eofbit
    状态并使提取失败。如果使用
    while(ss>>i>>ch)
    while
    将在达到最后一个
    int
    时计算为
    false
    。即使
    ss>>i
    会成功,
    >ch
    也会失败,因此
    i
    不会被添加到
    向量中


    理论上,如果(ss.peek()==',')ss.ignore(),您可以替换
    在循环内,使用
    字符ch;ss>>ch
    取而代之。至少对于像
    “23,4,56”
    这样的字符串,结束效果是相同的。但是,假设你得到了类似于“23 4 56”
    的东西。第一个示例无法正确处理该问题,但第二个示例在使用
    peek()+ignore()
    时处理得很好,但在使用
    ss>>ch
    时处理得不好。我认为您可以使用此代码来逃避“,”

    std::string valstr;
    while (std::getline(ss, valstr, ','))
    {
        vect.push_back(std::stoi(valstr));
    }
    

    我想你可以用这个代码来逃避“,”

    std::string valstr;
    while (std::getline(ss, valstr, ','))
    {
        vect.push_back(std::stoi(valstr));
    }
    

    你明白ch在第一段代码中做了什么吗?我显然不明白。我以为它默认为“,”定界,但雷米睁开了我的眼睛。你明白第一个代码片段中的
    >ch
    在做什么吗?我显然不明白。我以为它默认为“,”划界,但雷米睁开了我的眼睛。非常感谢你的回答。非常直观。非常感谢您的回答。非常直观。谢谢你的回答!谢谢你的回答!直到。