C++ C++;在for循环期间,代码不会在变量中累积和,只提供最终迭代值

C++ C++;在for循环期间,代码不会在变量中累积和,只提供最终迭代值,c++,C++,我的问题是变量‘scoreA’应该是for循环每次迭代期间生成的所有值的累积。然而,我并没有得到累积值,而只是在最后的迭代中得到值。有人能帮助我,因为我是新的C++。我在for循环之外定义了scoreA,所以我的理解是scoreA的值应该是所有迭代的累积值。但我的猜测是,它被重新分配到0,因为它无法累积值 #include<iostream> #include<map> #include<string> using namespace std; map

我的问题是变量‘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];
}
#包括
#包括
#包括
使用名称空间std;
地图计分制;
字符串StringA=“aaaa”;
int Score_Compute(字符串StringA);
int Base_case_A(int lenA);
int main()
{
得分方案[“ac”]=-1;
得分方案[“ag”]=-2;
得分方案[“在”]=-1;
得分方案[“a-”]=-3;
得分方案[“cg”]=-3;
得分方案[“ct”]=-2;
得分方案[“c-”]=-4;
评分方案[“gt”]=-2;
得分方案[“g-”]=-2;
评分方案[“t-”]=-1;
计分制[“--”]=0;
计分制[“aa”]=5分;
得分方案[“cc”]=5;
得分方案[“gg”]=5;
得分方案[“tt”]=5;
得分方案[“ca”]=-1;
得分方案[“ga”]=-2;
得分方案[“ta”]=-1;
得分方案[“-a”]=-3;
得分方案[“gc”]=-3;
得分方案[“tc”]=-2;
得分方案[“-c”]=-4;
得分方案[“tg”]=-2;
得分方案[“-g”]=-2;
得分方案[“-t”]=-1;
int len_StringA=StringA.size();
cout
Score\u Compute()
接受一个
std::string
作为输入,但是当循环调用
Score\u Compute(x)
时,
x
是一个
char[2]
包含2个
char
值,这两个值都不是空终止符

char[]
按原样传递给
std::string
时,
char[]
将衰减为
char*
,然后该
std::string
假定为空终止,而您的字符串则不是空终止

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

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

char x[3]; // <-- fix this!
x[0] = StringA[i];
x[1] = '-';
x[2] = '\0'; // <-- add this!
Score_Compute(string(x, 2));
或者,只需将
x
更改为
std::string
即可开始:

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

或:


这不会编译,所以它所做的是没有意义的。唯一没有编译的是有2个
main()
函数。删除第二个,然后,由于循环中的逻辑错误,它就不能正常工作。@Remy
Base\u case\u a
main
中如何?@NeilButterworth这是错误的
main()
需要删除的问题。另一个
main()
是要保留的正确问题。我已编辑问题以删除它now@Remy哪一个是“错误的主体”?
string x;
s.resize(2);
x[0] = StringA[i];
x[1] = '-';
string x = " -";
x[0] = StringA[i];