为什么无限循环

问题描述 投票:2回答:2

我正在制作一个函数,该函数将字符串作为输入并将出现的字母a-z存储在称为map1的映射中。我不知道为什么输出会超过122(int('z'))。我也尝试了while循环,以防万一。这是代码

#include <bits/stdc++.h>
using namespace std;

void makeAnagram(string a) {
    int map1[122][2];
    for(int i='a';i<='z';i++)
        map1[i][1] = 0;
    for(int i=0;i<a.size();i++)
        map1[a[i]][1]++;
    for(int i='a';i<='z';i++)
    {
        cout<<char(i)<<": "<<map1[i][1]<<endl;
    }
}

int main()
{
    string s ="abcwedddf";
    makeAnagram(s);
    return 0;
}

输出为

a: 1
b: 1
c: 1
d: 3
e: 1
f: 1
g: 0
h: 0
i: 0
j: 0
k: 0
l: 0
m: 0
n: 0
o: 0
p: 0
q: 0
r: 0
s: 0
t: 0
u: 0
v: 0
w: 1
x: 0
y: 0
z: 0
{: 32766
|: 32766
}: 21938
~: 32766
: 0
<and continued>.....

运行时错误:SIGSEGV

c++ stl
2个回答
1
投票

让我们暂时假设您正在使用ASCII编码。

当字符为map1时,您正在使用边界索引访问'~''~'的整数值为126。因此,您的程序具有未定义的行为。

您可以通过使用来解决问题

std::map<char, int> map1;

如果要确保它具有用于某些字符集的项目,则可以相应地对其进行初始化。

std::string init_string = "abcdefgh";
for ( char c : init_string )
{
   map1[c] = 0;
}

0
投票

如果(int)'z'122(不一定是这种情况),则在循环中,您正在访问map1[122][1],它是第123个元素的第二个元素,但是数组只有122x2个元素。此外,该数组中有很多元素您根本没有使用。 a不是0,也不清楚第二维是什么意思。使用std::map(或如果您不关心排序的情况下为unordered_map),最容易计数频率:

#include <map>
#include <iostream>
using namespace std;

void makeAnagram(string a) {
    std::map<char,unsigned> map1;

    for (auto c : a) map1[c]++;

    for (const auto& e : map1) {
        std::cout << e.first << ": " << e.second << "\n";
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.