好的,所以我正在写下面的函数,该函数打印一个字母在3个句子中出现的次数。当我用所有的字母运行它时,我得到的计数是遥不可及的。我认为问题在于,即使它以1行文本结束,它仍会继续建立索引,即使句子少于80个字符,它也会一直上升到80。问题是我对如何解决问题有点迷茫。
#include <iostream>
#include "StringProcessing.h"
int main()
{
char input[3][80];
std::cout << "Please enter 3 sentences: ";
for(int i = 0; i < 3; ++i)
std::cin.getline(&input[i][0], 80, '\n');
StringProcessing str(input);
return 0;
}
void StringProcessing::letterOccurrence(char input[3][80])
{
char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
int freq[26] = {0};
int i = 0;
while(i < 26)
{
for(int row = 0; row < 3; ++row)
{
for(int col = 0; col < 80; ++col)
{
if(alphabet[i] == input[row][col])
freq[i] += 1;
}
}
i++;
}
for(int i = 0; i < 26; ++i)
std::cout << freq[i] << " ";
}
给出时:abcdefghi jklmnopqr stuvwxyz(作为3个单独的句子)
我得到:1 2 1 1 1 1 1 1 1 1 1 1 3 10 1 2 1 4 1 2 2 1 14 2 1 1
答案 0 :(得分:2)
一个简单的解决方法是替换它:
for(int col = 0; col < 80; ++col)
{
if(alphabet[i] == input[row][col])
freq[i] += 1;
}
与此:
int col = 0;
while (input[row][col])
{
if(alphabet[i] == input[row][col])
freq[i] += 1;
++col;
}
答案 1 :(得分:1)
getline
会自动以空值终止读入的字符串,因此,如果input[row][col]
为'\0'
,则可以退出循环。
答案 2 :(得分:0)
换句话说,即使在句子后面,字符串也包含字符。
char input[3][80];
这实质上意味着,您正在声明3行80列的数组,但数据未设置为'\ 0'。因此,您的计数不应超过每个句子的长度。
答案 3 :(得分:0)
请尝试以下类似操作:
#include <iostream>
#include "StringProcessing.h"
int main()
{
char input[3][80];
std::cout << "Please enter 3 sentences: ";
for(int i = 0; i < 3; ++i)
std::cin.getline(input[i], 80, '\n');
StringProcessing str(input);
return 0;
}
void StringProcessing::letterOccurrence(char input[3][80])
{
int freq[26] = {0};
for(int row = 0; row < 3; ++row)
{
char *sentence = input[row];
for(int col = 0; col < 80; ++col)
{
char ch = sentence[col];
if (ch == '\0') break;
if ((ch >= 'a') && (ch <= 'z'))
freq[ch - 'a']++;
else if ((ch >= 'A') && (ch <= 'Z'))
freq[ch - 'A']++;
}
}
for(int i = 0; i < 26; ++i)
std::cout << freq[i] << " ";
}