Самое простое решение - инициализировать все значения в вашем массиве нулями:
int cnt[1000] = {0};
Вы должны сделать это явно, если только вы не используете глобальные переменные.
Но, как уже упоминалось в нескольких комментариях, это может вызвать другие проблемы, вплоть до вызова неопределенного поведения, связанного с интерпретацией знакового символа компилятора со значениями символов, превышающими 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';
См. Рабочую демоверсию .
При использовании стандартного c ++ это выглядит как естественный и наиболее удобный подход для вашей задачи (если только вам не нужно выполнять микрооптимизации при возникновении проблем с производительностью конкретного случая).