C++ Code 在 for 循环期间不会累积变量中的总和,仅提供最终迭代值

C++ Code does not accumulate sum in variable during for loop and provides only final iteration value

本文关键字:迭代 变量 循环 for Code C++      更新时间:2023-10-16

我的问题是变量"scoreA"应该是每次迭代 for 循环期间生成的所有值的累积。但是,我没有获得累积值,而是只在最后一次迭代中获取值。有人可以帮我,因为我是C++新手。我在 for 循环之外定义了 scoreA,所以我的理解是 scoreA 的值应该是所有迭代的累积值。但我的猜测是它被重新分配给 0,因此它无法累积值。

#include<iostream>
#include<map>
#include<string>
using namespace std;
map<string,int> Score_Scheme;
string StringA = "aaaa";
int Score_Compute(string StringA);
int Base_case_A(int lenA);
int main ()
{
Score_Scheme["ac"] = -1;
Score_Scheme["ag"] = -2;
Score_Scheme["at"] = -1;
Score_Scheme["a-"] = -3;
Score_Scheme["cg"] = -3;
Score_Scheme["ct"] = -2;
Score_Scheme["c-"] = -4;
Score_Scheme["gt"] = -2;
Score_Scheme["g-"] = -2;
Score_Scheme["t-"] = -1;
Score_Scheme["--"] = 0;
Score_Scheme["aa"] = 5;
Score_Scheme["cc"] = 5;
Score_Scheme["gg"] = 5;
Score_Scheme["tt"] = 5;
Score_Scheme["ca"] = -1;
Score_Scheme["ga"] = -2;
Score_Scheme["ta"] = -1;
Score_Scheme["-a"] = -3;
Score_Scheme["gc"] = -3;
Score_Scheme["tc"] = -2;
Score_Scheme["-c"] = -4;
Score_Scheme["tg"] = -2;
Score_Scheme["-g"] = -2;
Score_Scheme["-t"] = -1;

int len_StringA = StringA.size ();
cout<<"length of A is:"<<len_StringA<<"n";
Base_case_A(len_StringA);
return 0;
}
int Base_case_A(int lenA)
{
int scoreA  = 0;
for(int i = 0;i<lenA;i++)
{   
char x[2];
x[0] = StringA[i];
x[1] = '-';
scoreA=scoreA+Score_Compute(x);
cout<<i<<":"<<scoreA<<"n";
}
cout<<scoreA<<"n";
return 0;
}
int Score_Compute(string stringA)
{
return Score_Scheme[stringA];
}

Score_Compute()std::string作为输入,但是当循环调用Score_Compute(x)时,x是一个包含 2 个char值的char[2],这两个值都不是空终止符。

当一个char[]按原样传递给一个std::string时,char[]衰减到char*,然后std::string假设它是空终止的,而你的不是。

因此,Score_Compute()接收的std::string将是错误的,通常在您指定的字符之后包含随机数据(假设代码在搜索不存在的空终止符时不会完全崩溃(,因此它不会匹配std::map中的任何条目,导致Score_Compute()返回 0。

要修复逻辑,您需要将x的声明更改为char x[3];,然后在转换为std::string之前添加x[2] = '';

char x[3]; // <-- fix this!
x[0] = StringA[i];
x[1] = '-';
x[2] = ''; // <-- add this!

否则,您必须在转换为std::string时指定正确的长度:

Score_Compute(string(x, 2));

或者,只需将x更改为std::string即可:

string x(2, '');
x[0] = StringA[i];
x[1] = '-';

或:

string x;
s.resize(2);
x[0] = StringA[i];
x[1] = '-';

或:

string x = " -";
x[0] = StringA[i];