рассчитать частоту каждой буквы в строке

Я хочу рассчитать частоту каждой буквы в строке. Но это дает мне ошибку.
«Строковый индекс вне диапазона»
Пожалуйста, скажите мне, что не так с этим кодом.

  string text = "aaabbbbyyuuuuusdddddd" ;  //string of characters
float arr[256] ,freq[6] ;
int i=0 ;
while(i<256)    // initializing a new array of 256 indexes
{
arr[i] = 0.00 ;
i++ ;
}
i=0 ;
int value ;
// to increament the value within the indexes .index is the ASCII of the character in the string

while(text[i] != '\0' )
{
value = text[i] ;
arr[value] = arr[value] + 0.01 ;
i++ ;
}
int j=0 ;
i=0 ;
while(i<256)
{
if(arr[i] != 0.00)
{
freq[j] = arr[i] ;
j++ ;
}
i++ ;
}
j=0 ;
//displaying the frequencies of each character
while(j<6)
{
cout << freq[j] << endl ;
}

-2

Решение

Здесь есть две проблемы. Во-первых, пока std::string является завершается нулем (требуется в C ++ 11, де-факто в большинстве реализаций до этого), вы не можете получить доступ к прошлым size(), Если вы использовали string::at() напрямую, тогда вы получите удар:

reference at(size_type pos);
     Броски: out_of_range если pos >= size()

что было бы верно для нулевого терминатора. Так что правильный способ перебрать std::string это либо C ++ 11 способ:

for (value c : text) { ... }

или C ++ 03 путь:

for (size_t i = 0; i < text.size(); ++i) {
value = text[i];
...
}

Вам не нужно ходить, пока вы не нажмете '\0,

Вторая проблема — ваш терминальный цикл:

j=0 ;
//displaying the frequencies of each character
while(j<6)
{
cout << freq[j] << endl ;
}

Это не закончится. Это хорошая причина, чтобы предпочесть использовать for петли:

for (j=0; j < 6; ++j)
//               ^^^^ you were missing this
{
cout << freq[j] << endl ;
}
0

Другие решения

В до C ++ 11 std::strings не гарантируется прекращение \0 (в отличие от C-стиля char[]), спасибо Барри за то, что указал на это. использование std::string::size() найти размер строки.

Лучше попробуйте использовать std::map<char, size_t> для вашей задачи

#include <iostream>
#include <string>
#include <map>
#include <cstddef>

int main()
{
std::string text = "aaabbbbyyuuuuusdddddd";
std::map<char, std::size_t> freq;
for(auto c: text)
{
if( freq.find(c) == freq.end())
freq[c] = 1;
else
++freq[c];
}

for(auto elem: freq)
{
std::cout << elem.first << " -> " << elem.second << std::endl;
}
}
1

Полностью переделал ваш код, надеюсь, вы не возражаете, теперь он работает:

   char string[100] = "aaabbbbyyuuuuusdddddd";
int c = 0, count[26] = {0};
while ( string[c] != '\0' )
{

if ( string[c] >= 'a' && string[c] <= 'z' )
count[string[c]-'a']++;
c++;
}

for ( c = 0 ; c < 26 ; c++ )
{
if( count[c] != 0 )
printf("%c occurs %d times in the entered string.\n",c+'a',count[c]);
}
0
По вопросам рекламы [email protected]