1

このプログラムが機能しない理由がわかりません。

任意の方法で、3 つの文字列内のすべての文字の出現回数を見つける必要があります。

私は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
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ループにありません。

内側のループが終了すると、iです3。次に、配列の範囲外になる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];
}
于 2013-02-28T23:31:40.007 に答える
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 に答える