C ++的新手,所以这里是我正在研究的项目的一部分,用一个字符串打印最常用的数字以及它的使用次数。我认为这是对的,但由于某种原因,我的字符串不会被读入。有关如何修复的任何提示或建议?
#include <string>
#include <iostream>
using namespace std;
char getMostFreqLetter(string ss);
int main() {
string s; //initilizing a variable for string s
s = ("What is the most common letter in this string "); // giving s a string
getMostFreqLetter(s); // caling the function to print out the most freq Letter
return 0;
}
char getMostFreqLetter(string ss) {
int max, index, i = 0;
int array[255] = {0};
char letters[];
// convert all letters to lowercase to make counting letters non case sensative
for (int i = 0; i < ss.length(); i ++){
ss[i] = tolower(ss[i]);
}
//read each letter into
for (int i = 0; i < ss.length(); i ++){
++array[letters[i]];
}
//
max = array[0];
index = 0;
for (int i = 0; i < ss.length(); i ++){
if( array[i] > max)
{
max = array[i];
index = i;
}
}
return 0;
}
答案 0 :(得分:1)
如果您不将空格视为字母。
然后更有效的方式可能是
vector<int> count(26,0);
for (int i = 0; i < s.length(); i++) {
int range = to_lower(s[i])-'a';
if ( range >= 0 && range < 26)
count[range]++;
}
// Now you can do fix the max while iterating over count;
答案 1 :(得分:0)
使用string::c_str()。 它将字符串转换为字符数组。
答案 2 :(得分:-1)
您的代码中有一些错误。
首先,字符letters
数组完全未使用。您应该忽略它并迭代字符串ss
而不是我认为您打算这样做。
这会将您的第二个for循环从++array[letters[i]];
更改为++array[ss[i]];
。
其次,你的最后一个循环是错误的。您使用i作为索引来查找数组中的频率,而您需要使用字符的ascii值(ss [i])。这是一个带注释的固定版本:
index = ss[0];
max = array[index];
for (int i = 0; i < ss.length(); i ++){
if(!isspace(ss[i]) && array[ss[i]] > max)
{
max = array[ss[i]]; // you intended to use the ascii values of the characters in s to mark their place in array. In you code, you use i which is the just the index of the character in s as opposed to the ascii value of that character. Hence you need to use array[ss[i]].
index = ss[i];
}
}
return index;
进行上述更改后,在字符串上运行时会得到以下输出:
Most freq character: t