2017-08-26 86 views
-4

此代碼顯示此SIGSEGV錯誤,據我瞭解,它是一個分段錯誤。有人可以幫助! 代碼返回輸入字符串中不止一次出現的不區分大小寫的字母字符和數字的計數。 我正在使用這個編程挑戰,所以這只是一個功能。用SIGSEGV信號過早退出進程

所以,如果我輸入「aabcdef」它應該返回2,因爲'a'發生兩次。輸入可以包含字母以及數字。

int duplicateCount(const char* in) 
{ 
int a[39]={0},b=0; 
for(int i=0;i<strlen(in);i++) 
{ 
    if(in == NULL) 
     return 0; 


    if((int)in[i] < 97) 
    { 
     a[(int)in[i]]++; 
    } 
    a[tolower(in[i])-'a'+1]++; 
} 

for(int i=0;i<39;i++) 
{ 
    if(a[i]>1) 

     b++; 
} 


return b; 

} 
+0

怎麼樣'一個[ 'Z'] ++; 「離開了嗎? – snr

+0

@snr'Z'將被轉換爲'z',因此a [26] ++;沒有失控 – yaoshinga

回答

0

問題是在這裏

if((int)in[i] < 97) 
{ 
    a[(int)in[i]]++; 
} 
a[tolower(in[i])-'a'+1]++; 

您可以界限,正如我們所知,有UB外面寫。


修復

首先,你必須檢查是否字符是​​

然後,你必須通過tolower(c)

轉變角色,以降低和子頭低的情況下一封信函in alphabet c - 'a'

然後你可以索引一個數組並增加它的值。

Here is fixed code


由於我們是在,你可以使用std::map

#include <iostream> 
#include <map> 

int main() 
{ 
    std::string text("aabbc"); 
    std::map<char, int> letterCounter; 

    for(auto& it : text) 
    { 
     letterCounter[it]++; 
    } 

    for (auto& it : letterCounter) 
    { 
     if (it.second > 1) 
     { 
      std::cout << "Character " << it.first << " has appeared " 
         << it.second << " times." << std::endl; 
     } 
    } 

    return 0; 
} 

輸出

Character a has appeared 2 times. 
Character b has appeared 2 times.