C++读取pliki.txt二进制数统计可被2、8整除数量异常求助
解决二进制数字统计被2/8整除结果始终为0的问题
我碰到过好几次类似的问题,大概率是字符串读取或末尾判断的细节没处理好,导致你的逻辑根本没匹配到正确的二进制位。下面是几个最可能的原因和对应的修复方法:
1. 读取时混入了空白字符(最常见!)
如果你的文件里每个二进制数字占一行,读取时很容易把换行符\n或者回车符\r一起读进来。这时候你判断最后一位是'0'的话,实际拿到的是换行符,自然匹配失败,统计结果全是0。
修复方法:
读取每个字符串后,先去掉首尾的空白字符。比如在C++里可以写个简单的trim函数:
#include <algorithm> #include <cctype> void trim(std::string &s) { // 去掉开头空白 s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char c) { return !std::isspace(c); })); // 去掉结尾空白 s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char c) { return !std::isspace(c); }).base(), s.end()); }
每次读取完二进制字符串后,先调用trim(bin_str),再进行后续判断。
2. 末尾判断的字符匹配错了
你是不是把判断写成了最后一位 == 0?这里要注意,二进制字符串里的0是字符'0'(ASCII码48),而数字0是ASCII码0(空字符),这俩完全不一样!
正确的判断逻辑:
int licz_dwa = 0, licz_osiem = 0; std::string bin_str; std::ifstream file("pliki.txt"); while (std::getline(file, bin_str)) { trim(bin_str); if (bin_str.empty()) continue; // 跳过空行 // 判断能被2整除:最后一位是字符'0' if (bin_str.back() == '0') { licz_dwa++; } // 判断能被8整除:最后三位是"000",或者字符串本身是"0"(特殊情况) if (bin_str.size() >= 3) { if (bin_str.substr(bin_str.size() - 3) == "000") { licz_osiem++; } } else { // 长度不足3时,只有全0的二进制数(也就是"0")能被8整除 if (bin_str == "0") { licz_osiem++; } } } std::cout << licz_dwa << " " << licz_osiem << std::endl;
3. 文件读取方式不对
如果用cin >> bin_str读取,虽然会自动跳过空格,但如果文件里有空白行或者特殊编码(比如UTF-8 BOM开头),可能会读取到空字符串或者异常字符。换成getline逐行读取,再trim处理会更稳妥。
快速排查技巧
可以在读取后加一行打印,看看实际读到的内容是什么:
std::cout << "当前字符串:[" << bin_str << "]" << std::endl;
如果输出里看到[1010\n]或者[ 1100 ]这种带空格/换行的,那就是空白字符的问题,直接用trim解决就行。
内容的提问来源于stack exchange,提问作者Joff3R
相关产品推荐
相关产品推荐

