2016-04-27 8 views
-2

Ich habe ein Programm geschrieben, um die Zeichenhäufigkeit in einer Zeichenfolge zu berechnen, die vom Benutzer eingegeben wurde. Es liefert korrekte Ausgabe für alle Kleinbuchstaben, aber es funktioniert nicht für Großbuchstaben. Ich kann das Problem nicht im Code finden:Berechnen der Zeichenfrequenz in einem String mit C

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char string[100]; 
    int c = 0, count[26] = {0}; 

    printf("Enter a string\n"); 
    fgets(string,100,stdin); 

    while(string[c] != '\n') { 
     c++; 
    } 
    string[c] = '\0'; 
    c = 0; 

    while (string[c] != '\0') 
    { 
     /** Considering characters from 'a' to 'z' only 
      and ignoring others */ 

     if (string[c] >= 'a' && string[c] <= 'z') 
     count[string[c]-'a']++; 
     else if(string[c] >= 'A' && string[c]<= 'Z') 
     count[string[c]-'A']++; 

     c++; 
    } 

    for (c = 0; c < 26; c++) 
    { 
     /** Printing only those characters 
      whose count is at least 1 */ 

     if (count[c] != 0) 
     printf("%c occurs %d times in the entered string.\n",c+'a',count[c]); 
    } 

    return 0; 
} 

Bitte Hilfe!

Hier ist der Screenshot. Hoffentlich werden Sie verstehen, was Problem, das ich bin vor:

enter image description here

Es ist nicht die Großbuchstaben zu zählen.

+3

'while (string [c] =‚\ n ")" ist riskant. Was ist, wenn der Benutzer mehr als 100 Zeichen eingegeben hat? –

+3

Ich kann dein Problem nicht reproduzieren - es funktioniert gut für mich. –

+1

Funktioniert auch hier gut. – totoro

Antwort

2

Es funktioniert gut, aber die Ausgabe kann Sie verwirren! diese

Für die Eingabezeichenfolge "Foo", ist die Ausgabe:

f occurs 1 times in the entered string. 
o occurs 2 times in the entered string. 

Lower und Groß werden zusammengezählt, so dass Sie nicht sehen, "F 1 mal auftritt".

http://ideone.com/ACJnPD

+0

Danke! Dein Code zeigte mir, was ich falsch gemacht habe. –

+0

@BitanBasak Darf ich fragen, was Sie herausgefunden haben, war falsch? – totoro

3

Das einzige Problem, das ich sehe Grenzen ist ...

EDIT

Das vollständig übersprungen werden kann, da fgets() ein nachlauf '\0' gewährleistet und Sie behandeln '\n' graziös später in Ihre Schecks.

while(string[c] != '\n') { 
    c++; 
} 
string[c] = '\0'; 

So entfernen Sie die '\n' es

while(string[c] && string[c] != '\n') { 
    c++; 
} 
string[c] = '\0'; 

und

wegen der Semantik von fgets() sein sollte
while (string[c] != '\0') 

gut ist.

+4

'while (c <100 && string [c]! = '\ 0')' wird nicht benötigt. 'string [c]! = '\ 0'' ist ausreichend. 'string []' wird ein Null-Zeichen sein, wenn 'fgets()' 'NULL' nicht zurückgibt – chux

+0

@chux Ich wusste das nicht über' fgets() '. – totoro

+2

Corner Case: Wenn 'stdin' geschlossen ist, kann' fgets() 'mit dem' string [] 'zurückkommen, der weniger als 100 Zeichen enthält und immer noch ein '' \ n'' fehlt. In einem solchen Fall ist die 'string [c] = '\ 0';' ein Problem. Interessanterweise besteht keine Notwendigkeit für Code, um das potentielle nachhängende "\ n" abzulenken. – chux

0

IGuessing, dass das Problem auf separaten Zählung der Ober und Kleinbuchstaben Sie verschiedene Arrays Frequenzen zählen nutzen könnten:

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char string[100]; 
    int c = 0, countLower[26] = {0}; 
    int countUpper[26] = {0}; 

    printf("Enter a string\n"); 
    fgets(string,100,stdin); 

    while((string[c] != '\0') && (string[c] != '\n')) { 
     c++; 
    } 

    string[c] = '\0'; 
    c = 0; 

    while (string[c] != '\0') 
    { 
     /** Considering characters from 'a' to 'z' only 
      and ignoring others */ 

     if (string[c] >= 'a' && string[c] <= 'z') 
      countLower[string[c]-'a']++; 
     else if(string[c] >= 'A' && string[c]<= 'Z') 
      countUpper[string[c]-'A']++; 

     c++; 
    } 

    for (c = 0; c < 26; c++) 
    { 
     /** Printing only those characters 
      whose count is at least 1 */ 

     if (countLower[c] != 0) 
     printf("%c occurs %d times in the entered string.\n",c+'a',countLower[c]); 
     if (countUpper[c] != 0) 
     printf("%c occurs %d times in the entered string.\n",c+'A',countUpper[c]); 
    } 

    return 0; 
} 
Verwandte Themen