我正在制作一个函数,该函数将字符串作为输入并将出现的字母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
让我们暂时假设您正在使用ASCII编码。
当字符为map1
时,您正在使用边界索引访问'~'
。 '~'
的整数值为126。因此,您的程序具有未定义的行为。
您可以通过使用来解决问题
std::map<char, int> map1;
如果要确保它具有用于某些字符集的项目,则可以相应地对其进行初始化。
std::string init_string = "abcdefgh";
for ( char c : init_string )
{
map1[c] = 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";
}
}