C ++:如何并排打印两张ASCII图片?

时间:2016-10-13 22:59:23

标签: c++ ascii

所以我需要制作一个方法,它采用我创建的两张ASCII图片并将它们并排打印,所以方法调用:

concatHz(Picture l, Picture r);

其中Picture是一个对象,它将ASCII图片作为字符串存储在字段l.result和r.result中。

如果r是

+------+ 
|This  | 
|is the| 
|String| 
+------+

和l是:

This
is the
String

然后结果将是:

This  +------+
is the|This  |
String|is the|
      |String|
      +------+

我已经想到了这样做的方法,但它们看起来太复杂了,可能会有一种更简单的方法。我正在考虑使用for循环遍历每个字符串行并打印第一个字符串然后打印第二个字符串,但是这会遇到索引错误的问题,如上例所示。有没有一种简单的方法可以做到这一点,我没想到?

以下是创建基础ASCII图片的方法:

Picture Picture::create(std::vector<std::string> v){
    Picture c;  //default constructor called without parenthesis
    c.picList=v;
    c.result="";
    int max1=0;
    for(int i=0;i<v.size();i++){
        if(v.at(i).length()>max1){
           max1=v.at(i).length();
        }
        c.rows++;
        c.result+=v.at(i)+"\n";
    }
    c.maxLen=max1;
    return c;
}

2 个答案:

答案 0 :(得分:1)

不要将整个图片生成为单个std::string,您需要访问构成每个std::string的各个std::vector值。这样,您可以运行单个循环,其中每次迭代输出填充到l个字符的下一个l.maxLen字符串,然后输出下一个r字符串,然后输出换行符。两张照片都用完后结束循环。

例如:

#include <string>
#include <vector>

class Picture
{
private:
    std::vector<std::string> picList;
    std::size_t maxLen;
public:
    Picture();
    Picture(const std::vector<std::string> &v);

    static Picture create(const std::vector<std::string> &v);

    std::size_t getMaxRowLen() const;
    std::size_t getRows() const;
    std::string getRow(std::size_t index) const;

    // just in case you really need it
    std::string getResult() const;
};

#include <iostream>
#include <sstream>
#include <iomanip>

Picture Picture::create(const std::vector<std::string> &v)
{
    return Picture(v);
}

Picture::Picture()
    : maxLen(0)
{
}

Picture::Picture(const std::vector<std::string> &v)
    : picList(v), maxLen(0)
{
    for(std::vector<std::string>::const_iterator iter = picList.begin(); iter != picList.end(); ++iter) {
        if (iter->length() > maxLen) {
            maxLen = iter->length();
        }
    }
}

std::size_t Picture::getMaxRowLen() const
{
    return maxLen;
}

std::size_t Picture::getRows() const
{
    return picList.size();
}

std::string Picture::getRow(std::size_t index) const
{
    std::string row;
    if (index < picList.size()) {
        row = picList[index];
    }
    std::ostringstream oss;
    oss << std::setw(maxLen) << std::left << std::setfill(' ') << row;
    return oss.str();
}

std::string Picture::getResult() const
{
    std::ostringstream oss;
    for(std::vector<std::string>::const_iterator iter = picList.begin(); iter != picList.end(); ++iter) {
        oss << std::setw(maxLen) << std::left << std::setfill(' ') << *iter << "\n";
    }
    return oss.str();
}

void concatHz(const Picture &l, const Picture &r)
{
    std::size_t rows = std::max(l.getRows(), r.getRows());
    for (std::size_t i = 0; i < rows; ++i) {
        std::cout << l.getRow(i) << r.getRow(i) << "\n";
    }
}

答案 1 :(得分:0)

您已经使用字符串向量来表示屏幕内容。

只需将两个ASCII艺术图像存储在这样的矢量中,然后输出。

或者你也可以使用光标定位。 ncurses图书馆。