为什么以下代码为大于128字节的输入字符串打印垃圾值?

时间:2015-11-24 12:23:21

标签: c++11 vector

这是我最近遇到的 problem 代码。答案似乎适用于输入字符串的值小于128字节的每个测试用例,因为它传递a couple of test cases。对于大于128字节的每个值,它打印出一个似乎是垃圾值的大值。

std::string str;
std::cin>>str;
vector<pair<char,int>> v;
v.push_back(make_pair('C',0));
v.push_back(make_pair('H',0));
v.push_back(make_pair('E',0));
v.push_back(make_pair('F',0));
int i=0;
while(1)
{
    if(str[i]=='C')
        v['C'].second++;
    else if (str[i]=='H')
    {
        v['H'].second++;
        v['C'].second--;
    }
    else if (str[i]=='E')
    {
        v['E'].second++;
        v['C'].second--;
    }
    else if (str[i]=='F')
        v['F'].second++;
    else
        break;
    i++;

甚至在

中包含相同的代码
/*reading the string values from a file and not console*/
std::string input;
std::ifstream infile("input.txt");
while(getline(infile,input)) 
{
    istringstream in(input);
    string str;
    in>>str;
    /* above code goes here */
}

生成相同的结果。我不是在寻找任何解决方案或提示来得到正确的答案,因为我想测试我的算法的正确性。但我想知道为什么会发生这种情况,因为我是vector容器的新手。

-Regards。

3 个答案:

答案 0 :(得分:1)

if(str[i]=='C')
        v['C'].second++;

你正在修改v [67]

...它不包含在您的向量中,因此无效的内存或未初始化的

答案 1 :(得分:1)

您似乎尝试使用vector作为关联数组。 C ++中已经存在这样的结构:std::map。请改用它。

答案 2 :(得分:0)

使用此v['C'],您实际访问的是仅有4个项目的容器中的第67个(如果&#39; A&#39;是来自ASCII的65)元素。根据编译器和模式(debug vs release),您将获得代码的未定义行为。

您可能想要使用的是地图,即map<char,int> v;代替vector<pair<char,int>> v;而简单v['C']++;代替v['C'].second++;