2015-03-13 39 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

相關問題