第35行while (s.empty()) getline(cin, s);
,本来是单独一个getline(cin, s);
(在循环外使用了getchar()
取出输入流里的回车符)。
照原来那样写法,用vs2015编译器,程序能正确取到第一个字符串,但是用g++4.7.2却总是取出第一个字符串为空。不知为何。
#include <iostream>
#include <stdio.h>
#include <vector>
#include <cctype>
#include <string>
using namespace std;
int to_int(const string& color) {
int res = 0;
for (int i = 0; i < color.length(); ++i) {
int x = isdigit(color[i]) ? color[i] - '0' : color[i] - 'a' + 10;
res = res << 4 | x;
}
return res;
}
void print(const string& s) {
for (int i = 0; i < s.length(); ++i) {
int x = (int)s[i];
char a = x >> 4 >= 10 ? (x >> 4) - 10 + 'A' : (x >> 4) + '0';
char b = (x & 0xf) >= 10 ? (x & 0xf) - 10 + 'A' : (x & 0xf) + '0';
cout << "\\x" << a << b;
}
}
int main() {
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int m, n, p, q;
cin >> m >> n >> p >> q;
vector<vector<int> > colors_origin(n, vector<int>(m));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
string s;
while (s.empty()) getline(cin, s);
string t;
switch (s.size()) {
case 2:
t.append(6, s[1]);
break;
case 3:
t.append(3, s[1]).append(3, s[2]);
break;
case 4:
t.append(2, s[1]).append(2, s[2]).append(2, s[3]);
break;
case 7:
t = s.substr(1);
break;
}
colors_origin[i][j] = to_int(t);
}
}
string res;
static const char* const format = "\x1b[48;2;%d;%d;%dm";
static const char* const reset = "\x1b[0m";
char buf[24];
for (int i = 0; i < n / q; ++i) {
int cur_r = 0, cur_g = 0, cur_b = 0;
for (int j = 0; j < m / p; ++j) {
int r = 0, g = 0, b = 0;
for (int x = i * q; x < (i + 1) * q; ++x) {
for (int y = j * p; y < (j + 1) * p; ++y) {
int color = colors_origin[x][y];
r += color >> 16;
g += color >> 8 & 0xff;
b += color & 0xff;
}
}
r /= p * q;
g /= p * q;
b /= p * q;
if (!(cur_r == r && cur_g == g && cur_b == b)) {
if (r == 0 && g == 0 && b == 0) {
res.append(reset);
} else {
sprintf(buf, format, r, g, b);
res.append(buf);
}
cur_r = r, cur_g = g, cur_b = b;
}
res.append(1, ' ');
}
if (!(cur_r == 0 && cur_g == 0 && cur_b == 0)) res.append(reset);
res.append(1, '\n');
}
print(res);
return 0;
}