句子中的字母出现C ++

时间:2019-03-22 00:12:31

标签: c++

好的,所以我正在写下面的函数,该函数打印一个字母在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

4 个答案:

答案 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] << " ";
}