和旧友讨论的一道题目。
这一次是因为 UVA 1593 这道题目。
这道题目的链接:https://vjudge.net/problem/UVA-1593 。
代码是陈锋写的,原版的大概(说是大概,是因为改了头文件以使其可以使用
MSVC 正常编译)是这个样子,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #include <algorithm> #include <iomanip> #include <iostream> #include <sstream> #include <string> #include <vector> #define _for(i, a, b) for (int i = (a); i < (int)(b); ++i) using namespace std;const int MAXN = 1024 ; vector<string> Words[MAXN];size_t WL[MAXN];int main () { string line, word; int wc = 0 , lc = 0 ; fill_n (WL, MAXN, 0 ); while (getline (cin, line)) { stringstream ss (line) ; int wi = 0 ; while (ss >> word) Words[lc].push_back (word), WL[wi] = max (WL[wi], word.size ()), wi++; wc = max (wc, wi), lc++; } _for(i, 0 , lc) { const vector<string> &ws = Words[i]; _for(j, 0 , ws.size ()) { int w = j < ws.size () - 1 ? WL[j] + 1 : 0 ; cout << left << setw (w) << ws[j]; } cout << endl; } return 0 ; }
后面友人是重定向了一下,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #include <algorithm> #include <iomanip> #include <iostream> #include <sstream> #include <string> #include <vector> #define _for(i, a, b) for (int i = (a); i < (int)(b); ++i) using namespace std;const int MAXN = 1024 ; vector<string> Words[MAXN];size_t WL[MAXN];int main () { string line, word; int wc = 0 , lc = 0 ; fill_n (WL, MAXN, 0 ); FILE* stream1; freopen_s (&stream1, "./in.txt" , "r" , stdin); freopen_s (&stream1, "./out.txt" , "w" , stdout); while (getline (cin, line)) { stringstream ss (line) ; int wi = 0 ; while (ss >> word) Words[lc].push_back (word), WL[wi] = max (WL[wi], word.size ()), wi++; wc = max (wc, wi), lc++; } _for(i, 0 , lc) { const vector<string>& ws = Words[i]; _for(j, 0 , ws.size ()) { int w = j < ws.size () - 1 ? WL[j] + 1 : 0 ; cout << left << setw (w) << ws[j]; } cout << endl; } return 0 ; }
这里的代码,从逻辑上来讲,我觉得是完全没有问题,那么,问题只可能是出现在文件或者文本流的处理方面。我在
Linux 中使用 Clang 15 编译运行是一点问题都没有的,我一开始是直接在
terminal 中运行测试的,后面使用 uDebug
的数据进行测试,发现也是没有问题的。后面在 Windows 中的 PowerShell
中进行测试,发现也是没有问题的。
注意:这里要注意一个 EOF 的问题,在 Linux 的 Shell 中,使用
Ctrl + D
就可以了。而 Windows 中,我一开始使用
Ctrl + Z
发现不行,就使用了 Ctrl + C
乱试,结果得到的输出当然是错误的。后面终于意识到在输入
Ctrl + Z
之后再回车一下,EOF
就能够正常被读入了。然后程序输出的结果当然是正确的。
至于后面重定向使用文件作为输入输出之后,为什么又会出问题呢?
先描述一下问题:
输入文件是这个:
输出文件是这个,它第一行对不齐,
注意那个输入文件,它的文件编码格式是
UTF-8 with BOM
,这个格式的文件是不可以直接使用 C++
中的文本流进行处理的,它还需要一些额外的处理,所以这里就出现了一点问题。
我个人对解决这个问题的思路目前其实也仅仅就是把文件的编码格式换一下,就使用
VSCode
里面自带的操作就可以,像在这里的话,我们就直接点击右下角的编码名,后续按照提示进行修改即可。
把编码修改成 UTF-8
就可以了。
多说一句,之前其实身边的同学(wulw)也有遇到过这个问题的。所以这次一下就把这个问题定位了出来。