我的C ++代码中一个棘手的错误;怎么解决?

时间:2015-03-13 11:00:02

标签: c++ string if-statement for-loop counter

我在下面编写了这个代码,用于获取字符串(并将其放入数组)和数字的小程序,然后搜索数组以查找是否有重复字符(并计算重复次数) , 如果是这样;程序将比较特定字符重复的次数以及重复次数是否等于用户给出的次数;该计划将取代他们的角色' A'。例如;如果我们给予该计划" BBCC"它应该给我们结果" 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;
}

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

2 个答案:

答案 0 :(得分:1)

您需要在循环中重置counter变量。

对于ABC示例:

  1. 循环首先计算A s。有1 A,所以counter = 1
  2. 下一次迭代,它将计算B秒。有1 B,所以计数器增加到counter = 2
  3. 这是输入的数字,因此它会将所有B替换为A =&gt; AAC

答案 1 :(得分:0)

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,我会通过这个列表来放置每个元素&#34;指向&#34;按索引到&#39; <&#39;