1

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

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

我使用了 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;
}
4

5 回答 5

3

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

于 2013-02-28T13:20:56.133 回答
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;
    }
}
于 2013-02-28T13:21:38.647 回答
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;
}
于 2013-02-28T13:18:14.667 回答
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;

}

在这里,它正在发挥作用。

于 2013-02-28T13:25:54.653 回答
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使用{and为循环创建一个块}。这将保持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];
}
于 2013-02-28T23:31:40.007 回答