【问题标题】:getline function doesn't exit loop [duplicate]getline函数不退出循环[重复]
【发布时间】:2019-08-18 16:56:09
【问题描述】:

基本上我正在创建自己的字符串类,称为 MyString。在这个类中有一个名为 getline 的函数,它的执行应该与“字符串”类的 getline 函数完全一样。

但是经过测试,似乎该函数在到达空字符或指定的分隔符时并没有退出循环,而是不断提示输入,并将该输入添加到已经存在的字符串(c-string)中。

istream& getline (istream& is, MyString& stringC, char delim){
    int i = 0;
    do{
        is.get(stringC.stringM[i]);
        i++;
        if(i == stringC.Size){
            stringC.Grow(1);
        }
    }while(is.peek() != '\0' || is.peek() != delim);
    stringC.stringM[i] = '\0';
    return is;
}

我已经解决了我的最后一个问题,但现在我的 main 只是在我最后一次 getline 调用后关闭。

cin >> s1;
getline(cin,s2,',');
getline(cin,s3); 
//It ends here

cout << "\nNew string values:\n";

cout << "s1 = " << s1 << '\n';
cout << "s2 = " << s2 << '\n';
cout << "s3 = " << s3 << '\n';
cout << "---------------------------\n";

【问题讨论】:

  • is.peek() != '\0' || is.peek() != delim 这总是正确的。你想要is.peek() != '\0' &amp;&amp; is.peek() != delim
  • 总是足够接近。
  • 很好的发现。遗憾的是,我刚刚投票关闭作为一个错字。
  • 您的代码中的其他地方一定有另一个错误,这会导致您的崩溃。
  • 请不要为后续问题编辑您的问题,您可以发布另一个问题。

标签: c++ getline c-strings istream


【解决方案1】:

这是一个逻辑错误:

is.peek() != '\0' || is.peek() != delim

如果is.peek()== '\0', then it won't equaldelim(unless is also '\0') ifis.peek() == delim,那么它将不等于'\0'(同样,除非也是'\0')

您正在寻找:

is.peek() != '\0' && is.peek() != delim

如果is.peek() 等于'\0'delim,则终止循环

【讨论】:

  • 我现在看到了,我脑子里想的不一样,但是现在在 main 中使用时它会崩溃。
  • 你遇到了什么错误?
  • 我想不是真的崩溃,而是在不应该的时候关闭,我编辑了它在我的主要崩溃的地方。
猜你喜欢
  • 2021-12-17
  • 2017-04-05
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
相关资源
最近更新 更多