如何忽略输入流中的某些字符?

时间:2020-02-08 20:41:44

标签: c++

我需要接受用户的输入,这给我提供了红色,绿色和蓝色三种颜色,并以其相应的颜色打印出来。

输入形式为(255,255,255),每个逗号之间的数字范围为1到3个数字。我想将每个整数分别存储在_red,_green和_blue中,而忽略括号和逗号。

#include "color.h"
#include <string>
#include <iostream>

Color::Color(): _reset{true}{

}

Color::Color(int red, int green, int blue): _red{red}, _green{green}, _blue{blue}, _reset{false}{

}

std::string Color::to_string() const{
    return "(" + std::to_string(_red) + ","  + std::to_string(_green) + "," + std::to_string(_blue) + ")";
}

std::ostream& operator<<(std::ostream& ost, const Color& color){
    if(color._reset==false){
        ost << "\033[38;2;" << std::to_string(color._red) << ";" << std::to_string(color._green) << ";" << std::to_string(color._blue) << "m";
    }else{
        ost << "\033[0m\n";
    }
    return ost;
}

std::istream& operator>>(std::istream& ist, Color& color){
    ist.ignore(1,'(');
    ist >> color._red;
    ist.ignore(1,',');
    ist >> color._green;
    ist.ignore(1,',');
    ist >> color._blue;
    ist.ignore(1,')');
}

有问题的问题在运算符>>超载内。为什么此实现无法按预期工作?

1 个答案:

答案 0 :(得分:1)

首先,您的operator >>重载需要返回流,因为该流在实现中已更改。

以下代码在这里似乎可以正常工作: 我测试了(1,2,3),(0,255,0),(255,255,255),(127,0,1)...

#include <string>
#include <iostream>

struct Color {
    int r, g, b;

    std::string to_string() const;
};

std::string
Color::to_string() const
{
    return
        "{" + std::to_string(r) +
        "," + std::to_string(g) +
        "," + std::to_string(b) + "}";
}

std::istream&
operator>>(std::istream& ist, Color& color)
{
    ist.ignore(1,'(');
    ist >> color.r;
    ist.ignore(1,',');
    ist >> color.g;
    ist.ignore(1,',');
    ist >> color.b;
    ist.ignore(1,')');
    return ist;
}

int main()
{
    Color color;
    std::cout << "Insert color: ";
    std::cin >> color;
    std::cout << color.to_string() << std::endl;
    return 0;
}

由于您不会共享其余代码(Color类/结构的定义),因此可以执行以下操作来验证operator >>是否正常工作: / p>

在阅读值后立即打印!

std::istream&
operator>>(std::istream& ist, Color& color)
{
    ist.ignore(1,'(');
    ist >> color.r;
    ist.ignore(1,',');
    ist >> color.g;
    ist.ignore(1,',');
    ist >> color.b;
    ist.ignore(1,')');
    std::cout << r << " " << g << " " << b << std::endl;
    return ist;
}

似乎在代码的其他地方,成员变量的值正在更改。