首页 > 解决方案 > 如何在这个嵌套的 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:我确实需要它来分别计算小写和大写字母。

标签: c++

解决方案


首先,您可以使您的程序更小(大小)和更好(一般)使用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;
}

笔记

这两个版本都分别​​计算小写字母和大写字母,这是您想要的。

推荐阅读