【问题标题】:Compare many char variables in C++比较 C++ 中的许多 char 变量
【发布时间】:2013-12-07 17:03:13
【问题描述】:

我是一个初学者程序员,我很自责。我如何比较许多 char 变量? 所以,我在 .in 文件中有这样的 smt:

n(一个无符号变量,比如 7,有多少个字符)
A B C C B D B

.out 文件中我必须知道哪些字符被重复以及重复的频率:

B 3
C 2

我该怎么做?请帮我。我想我可以使用 for 和向量...但是如何使用?
我尝试了一些东西,但我不知道如何继续 :( (litera mean character)

unsigned n,i;
char litera;
f>>n;
for (i=1;i<=n;i++)
    f>>litera;

return 0;

【问题讨论】:

    标签: c++ vector char


    【解决方案1】:

    使用计数数组:

    int array[256] = {};
    unsigned int n,i;
    char tmp;
    f>>n;
    for (i=1;i<=n;i++)
        f>>tmp;
        array[tmp] ++;
    

    之后,您可以将数组中所有不为零的值打印到文件中。

    【讨论】:

    • 这不太可能正常工作,因为数组未初始化。
    • 好的,这很有效,非常感谢:* 我将这个版本与@Grzegorz 的版本结合起来
    【解决方案2】:

    更简单的方法是使用 std::map&lt; char, int&gt; 来存储每个字符的计数。

    unsigned n,i;
    f>>n;
    char ch;
    std::map< char, int > myMap;
    for (i=1;i<=n;i++) {
        f>>ch;
        if ( myMap[ch] )
          myMap[ch]++;
        else 
          myMap[ch] = 1;
    }
    

    否则使用字符向量。

    unsigned n,i;
    f>>n;
    vector<char> litera( n );
    for (i=1;i<=n;i++)
        f>>litera[i];
    

    计算重复次数的方法有很多。

    您可以先对向量进行排序并遍历元素。

    std::sort( litera.begin(), litera.end() );
    
    int count = 1;
    for ( int i = 0; i < litera.size(); i++ ) {
      if ( litera[i] == litera[i+1] ) 
        count++;
      else if ( count > 1 ) {
        std::cout << litera[i] << count << std:endl;
        count = 0;
      }
    }
    

    【讨论】:

      【解决方案3】:

      由于可能的字符数非常有限 (256),您可以定义一个大小为 255 的数组,它表示每个字符存在多少个实例。

      首先将这样的数组归零。然后迭代您的输入字符并增加您看到的每个单元格。最后将所有非零元素打印到输出文件。

      【讨论】:

      • +1 提供好的建议,而不是编写代码。学生真的应该做自己的功课。
      • 大小 255 --> 大小 256(索引从 0 到 255)
      • @Notinlist 老兄,我不在这里做作业,我只是练习一些 c++
      • @Bogdan 那么从另一种意义上来说,这是一个功课。尽管如此,我的评论仍然存在:-)
      【解决方案4】:

      我不会写完整的东西,因为我猜你需要/想要学习 C++,最好的办法是自己做。不过,这是一个想法。

      假设您只读取 ASCII 字符(当您使用 char 时)我会声明一个静态数组:

      int counts[256] ;
      

      然后最初用零填充它

      您可以使用memsetfor 循环来执行此操作。

      接下来,当您读取字符时,您会像这样增加 counts 数组的特定单元格:

      counts[litera]++ ;
      

      最后,当你读完后,循环遍历数组并打印出counts数组中的字母和对应的数字:

      for ( int i = 0 ; i < 256 ; i++ )
          if ( counts[ i ] != 0 )
              std::cout << static_cast< char >( i ) << " " << counts[ i ] << "\n" ;
      

      我希望它会有所帮助。

      【讨论】:

      • 您不能使用reinterpret_castint 转换为char,请改用static_cast
      • 好眼光!我的错。谢谢。
      • 建议int counts[256] = {0};
      • 所以,我在这里有一个警告:warning: array subscript has type 'char' [-Wchar-subscripts]
      • @Bogdan:我猜是counts[litera]++ ;?如果是这种情况,那么您可能需要将litera 的类型从char 更改为unsigned char。这是因为char是从-128到127,而unsigned char是从0到255
      猜你喜欢
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多