C++ Make std::cout在同一行中逐个输出多个字符串
标题乱七八糟,只看代码可能要快得多C++ Make std::cout在同一行中逐个输出多个字符串,c++,C++,标题乱七八糟,只看代码可能要快得多 p1_dado = rand() % 6 + 1; switch (p1_dado) { case 1: cout << ".-----." << endl; cout << "| |" << endl; cout << "| o |" << endl;
p1_dado = rand() % 6 + 1;
switch (p1_dado) {
case 1:
cout << ".-----." << endl;
cout << "| |" << endl;
cout << "| o |" << endl;
cout << "| |" << endl;
cout << "._____." << endl << endl;
p1_somma = p1_somma + p1_dado;
break;
case 2:
cout << ".-----." << endl;
cout << "| o |" << endl;
cout << "| |" << endl;
cout << "| o |" << endl;
cout << "._____." << endl << endl;
p1_ndadi--;
break;
case 3:
cout << ".-----." << endl;
cout << "|o |" << endl;
cout << "| o |" << endl;
cout << "| o|" << endl;
cout << "._____." << endl << endl;
p1_somma = p1_somma + p1_dado;
break;
case 4:
cout << ".-----." << endl;
cout << "| o o |" << endl;
cout << "| |" << endl;
cout << "| o o |" << endl;
cout << "._____." << endl << endl;
p1_somma = p1_somma + p1_dado;
break;
case 5:
cout << ".-----." << endl;
cout << "| o o |" << endl;
cout << "| o |" << endl;
cout << "| o o |" << endl;
cout << "._____." << endl << endl;
p1_ndadi--;
break;
case 6:
cout << ".-----." << endl;
cout << "| o o |" << endl;
cout << "| o o |" << endl;
cout << "| o o |" << endl;
cout << "._____." << endl << endl;
p1_somma = p1_somma + p1_dado;
break;
}
而不是:
1
2
3
4
5
感谢您的帮助:)代码片段:
char* hline = ".-----.";
char* dice[6][3] = { {"| |", "| o |", "| |" }, { ... }}; // 3 middle lines for each dice
for (int l=0; l < 5; ++l) {
for(int i=0; i < 6; ++i) // or any random dice sequence with index = dice value - 1
cout << (l == 0 || l == 4) ? hline : dice[i][l-1] << " ";
cout << "\n";
}
char*hline=“;
char*dice[6][3]={{{“| |”、“|o |”、“| |”}、{…};//每个骰子有3条中间线
对于(int l=0;l<5;++l){
对于(int i=0;i<6;++i)//或任何索引为骰子值-1的随机骰子序列
cout假设您安装了截取和重新排列输出的东西,实际输出基本上可以保持不变。因为我倾向于为流设置清除已编译行的键,唯一真正需要的更改是使用'\n'
替换。无论如何,这是我强烈建议的(有关解释,请参阅)
因此,假设定义了一个名为dicebuf
的东西,那么main()
函数可能是这样的(有趣的部分是函数中的第一个定义):
与上面的main()
一起,它应该会产生所需的输出。如果需要多行结果,只需注入一个刷新,例如使用
std::flush;
在战略方面。确实有办法,但这并不是你想要的那么简单。用'\n'
s替换所有endl
s。你不需要每次写入时都刷新cout
。ide告诉我“dice[i][i-1]”上的一个错误。我声明i=0,并为每个dice设置所有3条中间线(int l=0;i<5;++l)错误,用l<5替换i<5。仍然给我om骰子[i][i-1]:表达式必须具有整数或枚举类型下面是我发现的编码问题的简要说明:1.字符串文字不能分配给char*
,即hline
和dice
应该使用char const*
;2.在的第一个循环中,I
应该是l
(非常容易发现…);3.条件运算符的优先级低于移位运算符,即表达式需要括号。dice[i][l-1],不是i-1。修复。我对编程非常陌生,所以我不能理解你说的很多内容和很多代码。我知道输出不会改变,但只是它显示的方式,这就是我想要的。那么用户@rbaghbanli的解决方案呢?我无法让它工作…@GiorgioTocco:我很困惑:你似乎在说我的解决方案完全不起作用这就是你想要它做的。不过,你还是在问如何让次等解决方案起作用…?@GiorgioTocco:另一个答案的主要问题是它实质上干扰了逻辑。你最终基本上把一些逻辑翻了个底朝外。我强烈希望用一些代码来处理这些事情,而不是扭曲逻辑,即使我也不这么认为f它需要付出一些代价(使用流缓冲稍微慢一点,但我怀疑是否有可能测量典型使用中的差异)。
int main()
{
dicebuf buf(std::cout);
for (int i = 0; i != 5; ++i)
{
int p1_dado = rand() % 6 + 1;
switch (p1_dado) {
case 1:
std::cout << ".-----." << '\n';
std::cout << "| |" << '\n';
std::cout << "| o |" << '\n';
std::cout << "| |" << '\n';
std::cout << "._____." << '\n' << '\n';
break;
case 2:
std::cout << ".-----." << '\n';
std::cout << "| o |" << '\n';
std::cout << "| |" << '\n';
std::cout << "| o |" << '\n';
std::cout << "._____." << '\n' << '\n';
break;
case 3:
std::cout << ".-----." << '\n';
std::cout << "|o |" << '\n';
std::cout << "| o |" << '\n';
std::cout << "| o|" << '\n';
std::cout << "._____." << '\n' << '\n';
break;
case 4:
std::cout << ".-----." << '\n';
std::cout << "| o o |" << '\n';
std::cout << "| |" << '\n';
std::cout << "| o o |" << '\n';
std::cout << "._____." << '\n' << '\n';
break;
case 5:
std::cout << ".-----." << '\n';
std::cout << "| o o |" << '\n';
std::cout << "| o |" << '\n';
std::cout << "| o o |" << '\n';
std::cout << "._____." << '\n' << '\n';
break;
case 6:
std::cout << ".-----." << '\n';
std::cout << "| o o |" << '\n';
std::cout << "| o o |" << '\n';
std::cout << "| o o |" << '\n';
std::cout << "._____." << '\n' << '\n';
break;
}
}
}
#include <utility>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <string>
#include <vector>
struct dicebuf
: std::streambuf
{
std::ostream& out;
std::streambuf* sbuf;
std::vector<std::string> rows;
std::vector<std::string>::size_type row;
public:
dicebuf(std::ostream& out)
: out(out)
, sbuf(out.rdbuf())
, rows(1)
, row(0) {
out.rdbuf(this);
}
~dicebuf() {
this->sync();
this->out.rdbuf(this->sbuf);
}
int overflow(int c) {
if (c != std::char_traits<char>::eof()) {
if (c == '\n') {
if (this->rows[this->row].empty()) {
this->row = 0;
}
else {
++this->row;
if (this->rows.size() == this->row) {
this->rows.push_back(std::string());
}
}
}
else {
this->rows[this->row].push_back(c);
}
}
return std::char_traits<char>::not_eof(c);
}
int sync() {
std::ostream out(this->sbuf);
std::copy(this->rows.begin(), this->rows.end(),
std::ostream_iterator<std::string>(out, "\n"));
this->sbuf->pubsync();
this->row = 0;
this->rows.resize(0);
this->rows.push_back(std::string());
return 0;
}
};
std::flush;