我不明白为什么这个程序不起作用。
我需要通过任何方法找到三个字符串中所有字符的出现次数。
我使用了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;
}
答案 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)
小写'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
循环中。
内循环结束后,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];
}
保持在块内所有语句的范围内,并为循环的每次迭代重复语句。
{{1}}