通过char值访问一个整数数组

时间:2018-10-31 16:56:11

标签: c++ arrays char

下面是计算字符串中每个字符的出现次数的代码:

int cnt[1000];
string s = "fooooobar";
for (char i : s) cnt[i]++;
cout << cnt['o'] << '\n';
cout << cnt['a'] << '\n';
cout << cnt['r'] << '\n';
cout << cnt['b'] << '\n';

输出1:

5
1
33262
129355441

输出2:

5
1
33262
328199857

输出3:

5
1
33262
-1913409871

输出4:

5
1
33262
-826184015

如何访问带有int值的索引的char值数组以计算字符的特定出现次数?

为什么前2个结果有效,第三个结果无效,而第四个结果无效且每次都不同?

我使用g ++编译器,如下所示:

g++ -std=c++11 -Wall filename.cpp -o

2 个答案:

答案 0 :(得分:4)

最简单的解决方案是用零初始化数组中的所有值:

int cnt[1000] = {0};

除非您正在使用全局变量,否则您必须明确地做到这一点。

但是,正如在几条评论中提到的那样,这可能会引起其他问题,直到调用有关编译器的带符号char 解释的未定义行为,且字符值超过十进制表示形式的126

int cnt[1000];std::map<char,int>交换后,您的代码可以很好地工作:

std::map<char,int> cnt; // <<<<<<<<
string s = "fooooobar";
for (char i : s) cnt[i]++;
cout << cnt['o'] << '\n';
cout << cnt['a'] << '\n';
cout << cnt['r'] << '\n';
cout << cnt['b'] << '\n';

请参阅工作中的live demo

对于标准c ++,这实际上是解决问题的自然方法(除非遇到用例特定的性能问题,除非必须进行微优化) )。

答案 1 :(得分:2)

您的问题是您忘记将所有索引的cnt数组都设置为0,因为您只是声明了它,而没有初始化每个cnt[i]=0的每个i }个元素,默认情况下,i中的每个cnt个元素都会得到一个未指定(或随机)的值,因此,您得到的结果是错误的。您只需要使用调试器来查看代码中发生的事情,或者仅cout之前和之后的icnt[i]的每个值,因此您可以看到发生了什么事。

这是我的固定代码:

cnt[i]++

完成调试后,只需删除int cnt[1000]; string s = "fooooobar"; for (int i = 0; i < 1000; i++){ cnt[i] = 0; } for (char i : s){ cout << "i = " << i << "cnt[" << i << "] = " << cnt[i] << endl; cnt[i]++; cout << "i = " << i << "cnt[" << i << "] = " << cnt[i] << endl; } cout << cnt['o'] << '\n'; cout << cnt['a'] << '\n'; cout << cnt['r'] << '\n'; cout << cnt['b'] << '\n'; 函数,因为您不需要它们:) 最好的问候