Einzelne Zeichen in String zaehlen [geloest]
-
Hi!
Meine Aufgabe war es ein Programm zu schreiben, bei dem alle vorkommenden Zeichen aller übergebenen Kommandozeilenparameter gezählt werden sollen. Bei Zeichen, die nicht in der ASCII Tabelle [0...127] vorkommen, soll das Programm mit einer Fehlermeldung abgebrochen werden. Beispielsweise soll also der Programmaufruf
Programm.exe Hallo Welt
folgende Ausgabe bewirken:
'a' : 1x
'e' : 1x
'l' : 3x
'o' : 1x
't' : 1x
'H' : 1x
'W' : 1xMein Lösungsansatz sieht bis jetzt so aus:
#include <stdio.h> int wortlen(char folge[]) { int i = 0; while(folge[i] != '\0') { ++i; } return i; } int main(int argc, char * argv[]) { int anzahl; int laenge; int i, j, k; /*argv[i][j]; k = Stelle in ASCII Tabelle*/ char c; if (argc < 2) { printf ("Sie haben keine Parameter eingegeben"); return 1; } if (argc >= 2) { for(k = 0; k < 128; ++k) { anzahl = 0; for(i = 2; i <= argc; ++i) { laenge = wortlen(argv[i]); for(j = 0; j <= laenge; ++j) { c = argv[i][j]; if(c == k) { ++anzahl; } if(c < 0 && c > 127) { printf("\nUngueltige Eingabe"); return -1; } } } if(anzahl != 0) { printf("\n'%c' : %ix", c, anzahl); } } } return 0; }
Allerdings bekomme ich, wenn ich das Programm über die Konsole starten will, ledigilich die Meldung Programm.exe funktioniert nicht mehr.
Der Compiler (Visual Studio 2012) hat nichts zu meckern, deswegen bin ich im Moment eher ratlos..Schonmal vielen Dank für die Antworten!:)
-
Ich kann für den post aus irgendeinem Grund leider keinen Titel vergeben..
-
Arrays beginnen mit dem Index 0, ihr letzter Eintrag ist der mit dem Index Länge-1.
for(i = 2; i <= argc; ++i)
=>
for(i = 1; i < argc, ++i)
-
Danke für die schnelle Antwort, jetzt tut's was es soll
-
KJoke schrieb:
Ich kann fuer den post aus irgendeinem Grund leider keinen Titel vergeben..
Das Problem existiert z.Zt, wenn nicht-ASCII-Zeichen (Umlaute, ...) im Titel sind.
Wenn solche Zeichen im Text sind, funktioniert auch die Vorschau nicht.Da du ja selber
strlen
nachgebaut hast, weisst du auch wo C-Strings zuende sind.
Du hattest:laenge = wortlen(argv[i]); for(j = 0; j <= laenge; ++j)
Das kannst du abkuerzen in
for(j = 0; argv[i][j]!=0; ++j)
Du gehst 128 mal ueber deine Paramter. Das ist umstaendlich.
Mach ein Array mit 128 Elementen und darin zaehlst du die Zeichen.unsigned int anzahl[128] = {0}; ... for(i = 1; i < argc, ++i) { for(j = 0; argv[i][j]!=0; ++j) { c = argv[i][j]; if(c < 0 && c > 127) { printf("Ungueltige Eingabe\n"); // return -1; } ++anzahl[c]; } } for(k = 0; k < 128; ++k) { if(anzahl[k]!= 0) printf("'%c' (%3d) : %ux\n", k, k, anzahl[k]); }
-
Danke, die Lösung ist deutlich effizienter und v.a. werden die Anzahlen der einzelnen Zeichen abgespeichert, und nicht andauernd überschrieben, wenn ich den code richtig verstehe.
Es müsste aber
for(j = 0; argv[i][j]!='\0'; ++j)
heissen oder?
-
0 und '\0' haben beide den Wert Null. Bloß das erste ist ein Integer, das zweite ein char. Dieser Unterschied ist hier egal.