我正在尝试编写一个接受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.*/
答案 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")
x
是const 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.
}