我希望计算字符串中每个字母的频率。但是这给了我一个错误。
"字符串下标超出范围"
请告诉我这个代码有什么问题。
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 ;
}
答案 0 :(得分:1)
在C ++之前11 std::string
不能保证被\0
终止(与C风格的char[]
不同),感谢Barry指出这一点。使用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 :(得分:0)
完全重写你的代码,希望你不介意,它现在有效:
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]);
}
答案 2 :(得分:0)
这里有两个问题。首先,虽然std::string
以空值终止(在C ++ 11中是必需的,事实上在此之前的大多数实现中),但您无法访问过去的size()
。如果您直接使用string::at()
,则会受到影响:
,投掷:
reference at(size_type pos);
如果out_of_range
pos >= size()
对于null终止符也是如此。因此,迭代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 ;
}