Я хочу рассчитать частоту каждой буквы в строке. Но это дает мне ошибку.
«Строковый индекс вне диапазона»
Пожалуйста, скажите мне, что не так с этим кодом.
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 ;
}
Здесь есть две проблемы. Во-первых, пока 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 ;
}
В до C ++ 11 std::string
s не гарантируется прекращение \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;
}
}
Полностью переделал ваш код, надеюсь, вы не возражаете, теперь он работает:
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]);
}