2017-01-15 5 views
-1

Ich bin ein Anfänger mit C-Programmierung, so ist mein Code sehr einfach. Es zählt die Häufigkeit von Zeichen in einer Zeichenfolge. Das Programm wird zwar ausgeführt, aber das Problem besteht darin, dass jedes Zeichen so oft angezeigt wird, wie es in der Zeichenfolge angezeigt wird. Also, wenn ich hallo eintrage, bekomme ich "h tritt 1 mal auf, e tritt 1 mal auf, l kommt 2 mal vor, l kommt 2 mal vor, o kommt 1 mal vor". Wie beseitige ich das und mache die Zählung für l nur einmal sichtbar?Wie die Häufigkeit der Zeichen in einer Zeichenfolge

for(i=0;str[i]!='\0';i++) 
{ 
    for(j=0;str[j]!='\0';j++) 
     { 
      if(str[i]==str[j]) 
        count[i]++; 
     } 
} 
for(i=0;i<str[i]!='\0';i++) 
    printf("%c occurs %d times \n",str[i],count[i]); 
+1

Was ist die Definition von 'count'? Dein Code berechnet tatsächlich etwas völlig Zufälliges. Sie brauchen die innere Schleife nicht, aber Sie brauchen ein Array von Zahlen, wobei der Index 'str [i]' ist - der ASCII-Code des 'i'ten Zeichens in der Zeichenkette. – DyZ

+0

like [this] (http://ideone.com/Ns9quD) – BLUEPIXY

+2

@DYZ: Völlig zufällig ist nicht genau - es ist definiert, aber nicht was gewünscht wird. Ich stimme zu, dass die doppelte Schleife unnötig ist, aber Sie haben Ihren Fall überbewertet. Für einen zweimal erscheinenden Brief beträgt die Anzahl 4; für einen Brief, der dreimal erscheint, wird die Zählung 9 sein; Für einen Buchstaben, der N-mal erscheint, wird die Zählung N² sein. –

Antwort

0

können Sie so etwas wie verwenden

int characters[128] = {0}; 
char string[] = "Hello, World!"; 
for(int i = 0; string[i] != '\0'; i++) 
    characters[(int)string[i]]++; 

for(int i = 0; i < 128; i++) 
    if(characters[i] != 0) 
     printf("%c occurs %d times\n", (char)i, characters[i]); 
+2

Da ein 8-Bit 'char' 256 Werte annehmen kann (0..255 oder -128..127), ist es üblicher,' int frequency [256]; 'zu verwenden und sicherzustellen, dass Sie mit Werten von 0 indexieren ..255, werfe 'str [i]' mit '(unsigned char)', bevor du es zum Indizieren in das Array verwendest. –

0

Es wird ein wenig schwierig sein, die Anzahl der einzelnen Buchstaben eindeutig den Weg zu drucken Sie codiert haben. Versuchen Sie, die folgende Art und Weise:

int frequency[122] = {0}; //ascii value of z is 122. 
for(i=0;str[i]!='\0';i++) 
{ 
    frequency[str[i]]++; 
} 
for(i=0;i<=122;i++) { 
    if(frequency[i] != 0) 
     printf("%c occurs %d times\n", str[i], count[i]); 
} 
+2

Da ein 8-Bit 'char' 256 Werte annehmen kann (0..255 oder -128..127), ist es üblicher,' int frequency [256]; 'zu verwenden und sicherzustellen, dass Sie nach Werten von 0 indexieren ..255, wandle 'str [i]' mit '(unsigned char)', bevor du es zum Indexieren in das Array verwendest. –

+0

@ JonathanLeffler. Ja. Aber für dieses spezielle Problem befasst sich das OP nur mit Alphabeten - Groß- und Kleinschreibung. Technisch ist der Bereich des Problems von 65 (A) bis 122 (z) begrenzt. OP kann auch eine Bedingungsprüfung für den Wert von str [i] durchführen, um sicherzustellen, dass es sich in diesem Bereich befindet, bevor es verarbeitet wird. – VHS

+0

Die Frage erwähnt nirgends "Alphabet". Zeichen wie "à", "é", "ï", "ø", "ü", "ÿ" sind Zeichen, die in einer Zeichenkette gefunden werden können - und wenn die Zeichenkette in einem Single-Byte-Code codiert ist, z als 8859-15 sind sie einzelne Bytes im Bereich ohne Vorzeichen 128..255 oder signierter Bereich -128 ..- 1. Es gibt Interpunktionszeichen im Bereich 123..126, plus DEL bei 127; Dein Code wird diese nicht behandeln. Wenn Sie Werte außerhalb des Bereichs überprüft und ignoriert haben, wäre das mehr oder weniger OK. Programmierer, die unbegründete Annahmen über den Input machen, führen zu Viren und Trojanischen Pferden und ähnlichen Angriffen. –

1

Ich denke, Ihre eigene Funktion bauen, die duplizierten Zeichen entfernt Ihnen helfen würde, in das erreichen, was Sie zu tun versuchen. Aber es gibt keine Standardfunktion, die Ihnen helfen würde, alle Duplikate aus einer Zeichenkette zu entfernen. Versuchen Sie also, eine Funktion zu konstruieren, die alle doppelten/wiederholten Zeichen aus einer Zeichenkette entfernt und die Zeichenkette zurückgibt. Hier ist, was Ihre Funktion aussehen würde:

char* remove_duplicated(char* str, int size) { 
    int frequency[256] = {0}; 
    char* new_str = malloc(size); 
    int new_size = 0; 

    for(int i=0; str[i]!='\0'; i++) 
    { 
     if(frequency[(unsigned char) str[i]] == 0) { 
      frequency[(unsigned char) str[i]]++; 
      new_str[new_size] = str[i]; 
      new_size++; 
     } 
    } 

    new_str[new_size] = '\0'; 

    return new_str; 
} 

Sobald Sie die obige Funktion aufgebaut haben, senden Sie die Zeichenfolge in dem Sie die Frequenzen der Zeichen gemessen haben wollen und speichern Sie die zurückgegebene Zeichenfolge. Etwas wie folgt aus:

char* new_str = remove_duplicated(str, size); 

Jetzt im Doppel for Schleife, die Sie verwenden, verwenden new_str für Ihre äußere for-Schleife und es auch für die for Schleife verwenden Anzeigen count

for(i=0; new_str[i]!='\0'; i++) 
{ 
    for(j=0; str[j]!='\0'; j++) 
    { 
     if(new_str[i] == str[j]) 
      count[i]++; 
    } 
} 
for(i=0; new_str[i]!='\0'; i++) 
    printf("%c occurs %d times \n", new_str[i], count[i]); 

nicht vergessen

free(new_str); 

Hier ist eine Online-Demo: die malloced Array in der remove_duplicated Funktion frei https://ideone.com/KnkwGX

Verwandte Themen