我的C++代码中有一个棘手的错误;如何解决它

A tricky bug in my C++ code; How to fix it?

本文关键字:何解决 解决 错误 代码 C++ 有一个 我的      更新时间:2023-10-16

我在下面为一个小程序编写了这段代码,该程序获取一个字符串(并将其放入数组中)和一个数字,然后它搜索数组以查找它是否具有重复字符(并计算重复次数),如果是这样;程序将比较特定字符重复的次数以及重复次数是否等于用户给出的数字;该程序将替换他们带有字符"A"。例如;如果我们给程序"BBCC"和数字 2,它应该给我们结果"AAAA"。问题是我的代码适用于某些示例,而不适用于上面的示例。这是代码:

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
char str[30];
int i, j, k, l, number, counter = 0;
char ch;
cout << "Enter a string: ";
gets (str);
cout << "nEnter a number: ";
cin >> number;
for (i =0; str[i]; i++){
    ch = str[i];
    for (j = 0; str[j]; j++){
        if (str[j] == ch){
            counter++;
        }
    }
    if (counter == number){
        for (k = 0; str[k]; k++){
            if (str[k] == ch){
                str[k] = 'A';
            }
        }
    }
}
for (l = 0; str[l]; l++){
    cout << str[l];
}
getchar ();
return 0;
}

另一个错误是,如果我们给它字符串"ABC"和数字2;结果将是"AAC"!我知道我的代码有点混乱,因为我是初学者,所以请道歉并帮助我解决问题。谢谢。

您需要

在循环中重置counter变量。

对于ABC示例:

  1. 循环将首先计数 A s。有 1 A,所以counter = 1.
  2. 下一次迭代将计数B秒。有 1 B,所以计数器增加到 counter = 2
  3. 这是输入的数字,因此它将用 A =B 替换所有> AAC
for (i = 0 ; str[ i ] ; i ++ )
{
    if( str[ i ] != 'A' ) // because replacing A with A is pointless
    {
        counter = 0 ;
        ch = str[ i ] ;
        for ( j = 0 ; str[ j ] ; j ++ )
        {
            if ( str[ j ] == ch )
            {
                    counter ++ ;
            }
        }
        if (counter == number)
        {
            for ( j = 0 ; str[ j ] ; j ++ )
            {
                if ( str[ j ] == ch )
                {
                    str[ j ] = 'A' ;
                }
            }
        }
    }
}

我试图将所有关于更正的评论+一些优化放在一起,请告诉是否有任何问题

编辑:

C++11 对他的简化来说是美丽的;-)

map< char , vector< int > > counters ;
for (i = 0 ; str[ i ] ; i ++ )
{
    counters[ str[ i ] ].push_back( i ) ;
}
for( pair< char , vector< int > > liste : counters )
{
    vector< int > vec = liste.second ;
    if( vec.size( ) == number )
        for( int elt : vec )
            str[ elt ] = 'A' ;
}

说明:我浏览了数组,将每个索引都存储在与 char 关联的索引列表中(映射的用途)

最后,我只查看每个字符的向量大小,如果大小等于 number 我浏览此列表以将每个元素按索引"指向"到"A"