2017-08-26 4 views
-4

Dieser Code zeigt diesen SIGSEGV-Fehler, den ich verstehe, ist ein Segmentierungsfehler. Kann mir bitte jemand helfen! Der Code gibt die Anzahl der einzelnen alphanumerischen Zeichen und Groß- und Kleinbuchstaben zurück, die mehr als einmal in der Eingabezeichenfolge vorkommen. Ich benutze dies auf eine Programmier-Herausforderung, so dass dies nur eine Funktion ist.Prozess vorzeitig beendet mit einem SIGSEGV-Signal

Also, wenn ich "aabcdef" eingeben, sollte es 2 zurückgeben, weil 'a' zweimal auftritt. Die Eingabe kann sowohl Alphabete als auch Zahlen enthalten.

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

was 'a [ 'Z'] ++ verwenden können; 'Outta gebunden? – snr

+0

@snr 'Z' wird in 'z' umgewandelt, also a [26] ++; nicht außerhalb der Grenzen – yaoshinga

Antwort

0

Problem ist hier

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

Sie außerhalb der Grenzen schreiben kann, die, wie wir wissen, UB hat.


Fix

Zuerst müssen Sie prüfen, ob Zeichenbuchstabe mit isalpha(c)

sind Dann müssen Sie Zeichen niedriger über tolower(c)

transformieren und die ersten Low Buchstaben sub alphabetisch c - 'a'

Dann können Sie ein Array indizieren und dessen Wert erhöhen.

Here is fixed code


Da wir in sind, Sie 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; 
} 

Ausgabe

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