查找C ++中三个字符串中所有字符的出现次数

时间:2013-02-28 13:14:47

标签: c++

我不明白为什么这个程序不起作用。

我需要通过任何方法找到三个字符串中所有字符的出现次数。

我使用了count方法但是如果你们可以帮我找到find函数那么它会更好。

#include<iostream>
#include<algorithm>

using namespace std;

int main()
{
    string line[3];
    int count[3];
    cout << "Enter three lines of text...\n\n";
    cin >> line[0];
    cin >> line[1];
    cin >> line[2];
    int i;
    for(char j='a'; j<=26; j++) {
        for(i=0; i<3; i++)
            count[i] = std::count(line[i].begin(), line[i].end(), j);
        cout << "\n" << j << "\t" << ":" << "\t" << count[i];
    }

    system ("pause");
    return 0;
}

5 个答案:

答案 0 :(得分:3)

26不是字母,(char)26通常小于'a' - 所以你的循环不会执行。试试char j='a';j<='z';j++

答案 1 :(得分:3)

我会选择这样的事情:

#include <map>
#include <string>
#include <iostream>

int main()
{
    // Given 3 strings...
    std::string s1 = "Hello";
    std::string s2 = "Cruel";
    std::string s3 = "World";

    //===============================================
    // THESE 2 LINES ARE ALL YOU NEED FOR COUNTING
    std::map<char, int> countMap;
    for (char c : (s1 + s2 + s3)) { countMap[c]++; }
    //===============================================

    // Print the output. This is if you do not care about
    // characters that do not appear at all.
    for (auto const& e : countMap)
    {
        std::cout << e.first << ": " << e.second << std::endl;
    }

    // Print the output. This is if you DO care about
    // characters that do not appear at all.
    for (char c = ' '; c <= '~'; c++)
    {
        std::cout << c << ": " << countMap[c] << std::endl;
    }
}

答案 2 :(得分:1)

http://www.asciitable.com/

小写'a'是96.这小于26,这就是你的循环不执行的原因。尝试:

for (char j = 'a'; j <= 'z'; j++)

这只会计算小写字符。如果你想要出现大小写,你可以这样做:

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    string line[3];

    cout << "Enter three lines of text...\n\n";
    cin >> line[0];
    cin >> line[1];
    cin >> line[2];

    for(char j='a';j<='z';j++)
    {
        int upper_sum = 0;
        int lower_sum = 0;

        for(int i=0;i<3;i++)
        {
            lower_sum += std::count(line[i].begin(),line[i].end(),j);
            upper_sum += std::count(line[i].begin(),line[i].end(),j - 32); //32 = 'a' - 'A'
        }

        cout<<"\n"<<j<<"\t"<<":"<<"\t"<<lower_sum;
        cout<<"\n"<<(char)(j - 32)<<"\t"<<":"<<"\t"<<upper_sum;
    }
    return 0;
}

答案 3 :(得分:0)

这是您的程序的正确版本:

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
string line[3];
int count[3];
/*cout<<"Enter three lines of text...\n\n";
cin>>line[0];
cin>>line[1];
cin>>line[2];*/

      line[0] = "aaaaabbbbbbbbbbb";
      line[1] = "ccccccddddddddddd";
      line[2] = "kkkkkkkkkkkkk";

     int i;
     for(char j='a';j<= 'z';j++) // You can loop through the alphabet, but you need to go 'a' to 'z' and not 26
     { 

             for(i=0;i<3;i++) 
             { // You were missing these braces,  you need them if your loop contains multiple lines
               count[i]= std::count(line[i].begin(),line[i].end(),j);
               cout<<"\n"<<j<<"\t"<<":"<<"\t"<<count[i];
             }
    }

    system ("pause");
    return 0;

}

此处it is正在行动中。

答案 4 :(得分:0)

int i;
for(char j='a'; j<=26; j++) {
    for(i=0; i<3; i++)
        count[i] = std::count(line[i].begin(), line[i].end(), j);
    cout << "\n" << j << "\t" << ":" << "\t" << count[i];
}

您的cout行不在内部for循环中。

内循环结束后,i3。然后用cout调用count[i],该i越过数组的边界。未定义的行为,如果它崩溃你很幸运。

您的问题是cout。它声明的地方意味着它仍然存在,for(int i=0; i<3; i++) count[i] = std::count(line[i].begin(), line[i].end(), j); cout << "\n" << j << "\t" << ":" << "\t" << count[i]; 行可以引用它。如果将声明移动到循环初始化器,您将找到下一个错误:

i

最后一行不会编译,因为cout在循环结束时超出范围。我认为你错误地认为i是循环的一部分,部分原因是代码格式不佳,其次是因为for被宣布的范围更广。

要更正此问题,请使用{}i循环创建一个块。这将使for(int i=0; i<3; i++) { count[i] = std::count(line[i].begin(), line[i].end(), j); cout << "\n" << j << "\t" << ":" << "\t" << count[i]; } 保持在块内所有语句的范围内,并为循环的每次迭代重复语句。

{{1}}