【问题标题】:Bitshift operations and bitmask not detecting duplicate characters位移位操作和位掩码未检测到重复字符
【发布时间】:2020-02-15 15:44:12
【问题描述】:

我一直在尝试编写一个程序,该程序使用位掩码检查小写输入中的重复字母。但是,无论是否存在重复字母,程序都会返回 true。代码如下:

#include <iostream>
#include <cctype>
#include <cstring>

using namespace std;

bool all_unique_letters(const string &s) {
    int bitset;

    for(char const &c : s)
    {
        unsigned char set = 1 << (c - 'a');

        if(set & bitset)
            return false;

        bitset |= set;
    }

    return true;
}

int main(int argc, char * const argv[]) {
    // TODO: reads and parses command line arguments.
    // Calls other functions to produce correct output.
    if(all_unique_letters(argv[1]))
        cout << "All letters are unique!" << endl;
    else
        cout << "Duplicate letters found." << endl;
}

【问题讨论】:

  • 好吧,gdb 向您展示了什么,如果您声称您使用过它?除了由于使用未初始化的变量而导致的未定义行为之外,for 循环中没有任何会导致段错误的内容。你给你的程序传递了什么参数?小测验:argc 的值是多少?
  • @SamVarshavchik 是的,我认为我正确地将参数传递给 gdb,但我没有。不过,它总是返回 true,我不明白。似乎按位运算应该可以工作。
  • 正如@SamVarshavchik 所述,尝试打印您传递给all_unique_letters 函数的argc 和argv[1]。
  • 请重新阅读我第一条评论中第二句的第一部分,这解释了为什么您的按位运算似乎不起作用。
  • 好的,还有一个问题。至此,既然你知道如何使用调试器,那为什么不使用它来弄清楚它为什么返回 true。应该非常明显。这是任何知道如何使用调试器的人都应该能够弄清楚的事情。这就是调试器的用途:让您自己查找和修复错误,而不是等待 stackoverflow.com 上的人为您解决问题。

标签: c++ bit-shift bitmask


【解决方案1】:

我看到了两个问题。首先,您的 bitset 变量未初始化。其次,set 变量的类型是 unsigned char 8 位类型。对于小写字母,您需要至少 26 位来测试您的 bitset。解决这两个问题后,您的代码似乎可以工作。

bool all_unique_letters(const string &s) {
    int bitset = 0; // fixed

    for(char const &c : s)
    {
        int set = 1 << (c - 'a'); // fixed

        if(set & bitset)
            return false;

        bitset |= set;
    }
    return true;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多