下面是计算字符串中每个字符的出现次数的代码:
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
答案 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
之前和之后的i
和cnt[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';
函数,因为您不需要它们:)
最好的问候