如何解决C ++中的“指针与整数之间的比较”错误?

时间:2019-08-07 04:44:36

标签: c++

我正在尝试编写一个接受2个字符串输入并为字符串输入中的每个字母分配一个数值的程序。然后,该程序会将分配给字符串输入中字母的数字值倍增,并查看两个输入的值(模47)的乘积是否相等。如果它们相等,则程序必须输出“是”,否则,必须输出“否”。

我正在使用蛮力方法,所以请随时提出更有效的方法以及如何实现它们。我到了IDE只能发出几个警告,但没有错误的地步。但是,当我运行该程序时,我得到一条非法指令,这实际上是由于特定的功能所致,我将在稍后显示。

我将建议我的问题解决方案不包含任何额外的类库和文件。 谢谢;)

例如,在此长函数中,我尝试使用蛮力方法:

这从返回类型int的函数中获取值,该函数将数字值分配给6个字母输入,并将它们返回到返回类型bool的变量,该变量在返回a之前查找并比较两个字符串的最终乘积bool类型的值。我使用了蛮力方法,将字符串中的每个字母与一个字母进行比较并分配一个值。我很确定第一个功能不正确,尽管我不知道如何解决它。

int parse(const char * x)
{

    if (x == "A")
    {
        return 1;
    }
    if (x == "B")
    {
        return 2;
    }
    if (x == "C")
    {
        return 3;
    }
    if (x == "D")
    {
        return 4;
    }
    if (x == "E")
    {
        return 5;
    }
    if (x == "F")
    {
        return 6;
    }
    if (x == "G")
    {
        return 7;
    }
    if (x == "H")
    {
        return 8;
    }
    if (x == "I")
    {
        return 9;
    }
    if (x == "J")
    {
        return 10;
    }
    if (x == "K")
    {
        return 11;
    }
    if (x == "L")
    {
        return 12;
    }
    if (x == "M")
    {
        return 13;
    }
    if (x == "N")
    {
        return 14;
    }
    if (x == "O")
    {
        return 15;
    }
    if (x == "P")
    {
        return 16;
    }
    if (x == "Q")
    {
        return 17;
    }
    if (x == "R")
    {
        return 18;
    }
    if (x == "S")
    {
        return 19;
    }
    if (x == "T")
    {
        return 20;
    }
    if (x == "U")
    {
        return 21;
    }
    if (x == "V")
    {
        return 22;
    }
    if (x == "W")
    {
        return 23;
    }
    if (x == "X")
    {
        return 24;
    }
    if (x == "Y")
    {
        return 25;
    }
    if (x == "Z")
    {
        return 26;
    }
}

bool returnfunc(std::string & GROUP, std::string & k)
{

    const char A = GROUP[0];

    const char B = GROUP[1];

    const char C = GROUP[2];

    const char D = GROUP[3];

    const char E = GROUP[4];

    const char F = GROUP[5];

    int xet = parse(&A);

    int r = parse(&B);

    int m = parse(&C);

    int z = parse(&D);

    int h = parse(&E);

    int j = parse(&F);
    double mu = (xet * r * m * z * h * j) % 47;

    const char G = k[0];
    const char H = k[1];
    const char I = k[2];
    const char J = k[3];
    const char K = k[4];
    const char L = k[5];
    int w = parse(&G);
    int x = parse(&H);
    int y = parse(&I);
    int a = parse(&J);
    int b = parse(&K);
    int c = parse(&L);

    double fin = (w * x * y * a * b * c) % 47;
    {
        if (mu == fin)

        {
            return true;
        }

        else
        {
            return false;
        }
    }
}

/*I expected the program to run but it didn't and I don't understand 
 why.*/

3 个答案:

答案 0 :(得分:4)

这是错误的

if (x=="A")

因为它比较两个指针是否等于指针相等。它不会比较那些指针所指向的内容(这就是您要执行的操作)。

这是代码的更简单版本,它保持相同的结构,但不包含任何指针(由于某些原因,新手喜欢使用指针,因为我从未理解过它们的难易程度)。

int parse(char x)
{
    if (x == 'A')
        return 1;
    if (x == 'B')
        return 2;
    // etc etc
}

然后

int xet = parse(A);
int r = parse(B);
// etc etc

PS,编写parse函数的更简洁的方法是使用查找表和循环

int parse(char x)
{
    const char* table = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    for (int i = 0; i < 26; ++i)
        if (x == table[i])
            return i + 1;
    return 0; // error return
}

答案 1 :(得分:1)

int parse(const char * x) {
    if (x == "A")

xconst char*,而"A"const char*,但是即使它们指向具有相同字符的C字符串,它们也不相等,因为比较比较了C字符串的地址,而不是内容。

此外,如果您的parse函数找不到匹配项,则它将退出该函数,而不会返回未定义行为的值。

尝试以下方法:

int parse(char x) {
    if(x >= 'A' && x <= 'Z') return x - 'A' + 1;
    else return 0;
}

并以char本身作为参数(而不是指向它的指针)调用parse

const char A = GROUP[0];
int xet = parse(A);

答案 2 :(得分:0)

主要由于您的问题的这一部分而很难回答这个问题:

  

我已经达到了我的IDE仅给出几个警告而没有错误的地步。

可能有一个警告,我们不知道这可能是您的问题的一部分。但是,无论如何我都会对一些错误采取行动。

所以,第一行是这里:

int parse ( const  char * x)

现在,就其本身而言,这还不错,除了它与诸如此类的东西相结合:

if(x=="A")
{
  return 1;
}

那真是不好。 x是一个指针。这意味着x中的值存储是一个地址。这意味着您comparing the c string "A"到一个地址。通常这不是一件好事。

您想要的可能是这样:

if(*x == "A")

那好多了。

实际上,并非完全如此,因为您probably want single quotes here而不是双引号:

if(*x == 'A')

顺便说一句,您可能可以简化解析函数,如下所示,它会做同样的事情:

int parse ( const  char * x) {
    return (*x - 'A') + 1; // parenthesis for clarity. Not really needed here.
}