第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; }