c++ - 如何在这个嵌套的 for 循环中按顺序输出数组中的字符?
问题描述
我的代码计算一个字符在字符串中出现的次数,它可以工作,但由于 ASCII 表排序,它没有按我想要的方式显示它。
我想要的输出:
enter string value: Prog
P - 1
r - 1
o - 1
g - 1
但相反,我按字母顺序得到它:
enter string value: Prog
g - 1
o - 1
P - 1
r - 1
这是我的代码:
char str[100] = "";
int sum = 0;
cout<<"Enter String Value: ";
gets(str);
//char counter uppercase
for (int i = 65; i<=90; i++)
{
sum = 0;
for (int j=0; j<sizeof(str); j++)
{
if((int)str[j] == i)
{
sum = sum + 1;
}
}
if (sum > 0)
{
cout<<(char)i<<" - "<<sum<<endl;;
}
}
//char counter lowercase
for (int i = 97; i<=122; i++)
{
sum = 0;
for (int j=0; j<sizeof(str); j++)
{
if((int)str[j] == i)
{
sum = sum + 1;
}
}
if (sum > 0)
{
cout<<(char)i<<" - "<<sum<<endl;;
}
}
PS:我确实需要它来分别计算小写和大写字母。
解决方案
首先,您可以使您的程序更小(大小)和更好(一般)使用std::map
版本 1:不按插入顺序显示输出
#include <iostream>
#include <map>
int main() {
std::string inputString;
std::cout<<"Enter a string: ";
std::getline(std::cin,inputString);
//this map maps the char to their respective count
std::map<char, int> charCount;
for(char &c: inputString)
{
charCount[c]++;
}
for(std::pair<char, int> pairElement: charCount)
{
std::cout << pairElement.first <<"-" << pairElement.second<<std::endl;
}
return 0;
}
上述版本 1 的输出如下:
Enter a string: Prog
P-1
g-1
o-1
r-1
请注意,在上述顺序中,字符的顺序是按字母顺序排列的。如果您希望按顺序输出,请执行以下操作:
版本 2:根据需要按插入顺序显示输出
#include <iostream>
#include <map>
int main() {
std::string inputString;
std::cout<<"Enter a string: ";
std::getline(std::cin,inputString);
//this map maps the char to their respective count
std::map<char, int> charCount;
for(char &c: inputString)
{
charCount[c]++;
}
//just go through the inputString instead of map
for(char &c: inputString)
{
std::cout << c <<"-" << charCount.at(c)<<std::endl;
}
return 0;
}
第二版的输出如下:
Enter a string: Prog
P-1
r-1
o-1
g-1
此外,当输入具有重复出现的字符(如“AnoopRana”)时,上述版本 2 的输出将重复如下所示:
Enter a string: AnoopRana
A-1
n-2
o-2
o-2
p-1
R-1
a-2
n-2
a-2
每个字符只显示一次,你可以看到这个程序如下:
第 3 版:用于按插入顺序仅显示每个字符一次
#include <iostream>
#include <map>
int main() {
std::string inputString;
std::cout<<"Enter a string: ";
std::getline(std::cin,inputString);
//this map maps the char to their respective count
std::map<char, int> charCount;
for(char &c: inputString)
{
charCount[c]++;
}
std::size_t i = 0;
//just go through the inputString instead of map
for(char &c: inputString)
{
std::size_t index = inputString.find(c);
if(index != inputString.npos && (index == i)){
std::cout << c <<"-" << charCount.at(c)<<std::endl;
}
++i;
}
return 0;
}
笔记
这两个版本都分别计算小写字母和大写字母,这是您想要的。推荐阅读
- python - 为什么 Python dict 已经排序?
- c# - c#动态创建system.windows.forms.label
- excel - 返回基于多个下拉单元格的值
- python - 如何在 Python 中接收 Watson Speech to Text SDK 的全部输出?
- spring - 清理spring批处理元数据mongodb
- string - 如何在 bash 中创建包含任意长度的 A 的字符串?
- javascript - 我如何从对象中存储对象,该对象本身存储在对象数组中的对象(例如下面)中?
- visual-studio - 当我保存脚本时,VS2019 正在删除我的引用?
- android - 在 XML 中绑定 LiveData 时找不到访问器
- android - Android Studio 无法从高级属性视图更改为基本属性视图