2015-03-13 38 views
-4

我在下面为一个小程序写了下面的代码,该程序获取一个字符串(并将其放入一个数组中)和一个数字,然后通过数组搜索它是否有重复字符(并计算重复次数),如果是这样;该程序将比较特定字符重复的次数和重复次数是否等于用户给出的次数;该程序将用字符'A'代替它们。例如;如果我们给节目“BBCC”和数字2,它应该给我们结果“AAAA”。问题是我的代码适用于某些示例,不适用于上述示例。下面是代码:我C++代码中的一个棘手的错误;如何解决它?

#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”! 我知道我的代码有点凌乱,因为我是初学者,所以请道歉并帮助我解决我的问题。 谢谢。

+1

我不知道这个问题是如何帮助未来的访问者吗? :/ – 2015-03-13 11:01:35

+2

不要使用'gets',而应使用'std :: string'和普通的输入运算符'>>'。 – 2015-03-13 11:04:03

+0

至于你的问题,学习如何使用调试器,在编译器和编辑器旁边,它应该是工具箱中最常用的工具。使用调试器,您可以逐行浏览代码,同时查看所有涉及的变量的值,这将帮助您了解代码是否按照您期望的方式运行。 – 2015-03-13 11:06:47

回答

1

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

对于ABC例如:

  1. 循环将第一计数A秒。有1个,所以counter = 1
  2. 下一次迭代它将计数B s。有1 B,所以计数器增加到counter = 2
  3. 这是输入的号码,则其将被A =>AAC
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' ; 
       } 
      } 
     } 
    } 
} 

全部更换B的I试图把在校+一些优化所有评论意见,请告诉我们,如果任何事情仍然是错的

编辑:

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' ; 
} 

解释:我去通过阵列,股票相关的字符的索引列表每个索引(地图是什么)

末,我只是看每个向量的大小字符,如果大小等于number我通过此列表将每个元素“指向”索引到'A'

+0

这个效果很好,非常感谢!为循环(i,j和k)定义不同的变量是必要的吗? – hashtagger21 2015-03-13 11:43:57

+0

不适用于j和k因为他们是不相交的,我纠正它thx:D(顺便说一句,应该添加很多优化,因为它仍然非常讨厌:-P,想象你得到18'a',并且n不是18,那么你将通过整个数组18次,这是非常糟糕的,你应该能够通过使用std :: map Guiroux 2015-03-13 12:17:55

相关问题