[c] Zählen der zeichen einer Zeichenkette

Bismark

Erfahrenes Mitglied
Hallo Lleute,
ich bin gerade beim programmieren eines (Konsolen)Programms unter OpenSuse 10.1, bei dem ein Benutzer bis zu 150 zeichnen in ein char Array Eingeben kann, dabei existiert ein zweites Array von int, für die Anzahl der einzelnen zeichnen. Am ende sollen die alle Zeichen gezählt werden und (nur die eingegebenen) auf dem Bildschirm in einer Tabelle ausgegeben werden. (Z.B. a =8; g = 9; k = 1).

Mein Problem ist, ich weiß nicht wie man ein Code schreibt, der eine art "Dynamische Tabelle" erstellt, der nur die eingegebenen zeichnen zählt und sie ausgibt noch wie man die zeichnen an sich zählen lässt.:( :-(
Wobei bei Zeichenzählen könnte man doch eigentlich ein Sortieralgorithymus benutzen und anschließend die Felder miteinander vergleichen? :rolleyes:

Lg Bismark
 
Hi

Ich nehme an, du sprichst vom ASCII (bzw. irgendein Einbyte-Zeichensatz), kein Unicode etc?

Dann denkst du zu kompliziert :D

Nimm ein int-Array, Größe 256.
In alle 256 0 reinschreiben.
Jetzt gehst du jeden eingegeben Buchstaben durch und zählst bei seinem Wert eins rauf (zB bei 'a' das 97. int)
Fertig.

Zum Ausgeben: Alle 256 ints durchgehen, den Index als Zeichen und den Inhalt als Anzahl nehmen.
Wenn du die nicht vorkommenden auslassen willst, gibst du eben nur die >0 aus.

Noch zu beachten: ASCII-Zeichen von 0 bis 31 in diesem Fall besser nicht direkt ausgeben, sondern irgendwas wie "Zeichen xx" hinschreiben.
Sonst bekommst du an unpassenden Stellen Zeilenumbrüche etc; sogar ein Ton ist dabei...

Und beim int-Array: Ich nehme an, dein String besteht aus signed chars.
Beim negativen Zeichen darfst du im int-Array nicht auf negative Indizes schreiben, sondern auf 128-255.
(index<0)?(256+index):index

Gruß
 
C:
#define MAXZEICHENZAHL 150

char eingabe[MAXZEICHENZAHL+1];
fgets( eingabe,sizeof eingabe,stdin );
if( strchr(eingabe,'\n') ) *strchr(eingabe,'\n')=0; else while( getchar()!='\n' );
printf("Es wurden %ld Zeichen eingegeben und zwar <%s>",strlen(eingabe),eingabe);
sollte wohl ein Ansatz zur Problemlösung sein.
 
Hi,

Hi

Ich nehme an, du sprichst vom ASCII (bzw. irgendein Einbyte-Zeichensatz), kein Unicode etc?

Dann denkst du zu kompliziert :D

Nimm ein int-Array, Größe 256.
In alle 256 0 reinschreiben.
Jetzt gehst du jeden eingegeben Buchstaben durch und zählst bei seinem Wert eins rauf (zB bei 'a' das 97. int)
Fertig.

Zum Ausgeben: Alle 256 ints durchgehen, den Index als Zeichen und den Inhalt als Anzahl nehmen.
Wenn du die nicht vorkommenden auslassen willst, gibst du eben nur die >0 aus.

Das Programm soll halt für die ASCII zeichen programmiert werden. Hab eine frage und zwar, es gibt ja zwei Arrays, einmal z.B. char Eingabe[151] und int Pruef[256]. Muss ich den Array Eingabe[] mit sich selbst vergleichen und bei Pruef[] hochzählen, woher wies ich denn z.B. bei welchem Array beim Pruef[] 'a' oder 'e' gezählt wird, vor allem bei der Ausgabe? Man muss es ja mehr oder weniger mit einer "Hilfvariable" durchführen. Wenn z.b. 't' eingegeben wird, nehme ich dann halt t als variable um den Index Hochzuzählen?

lg
 
Einem ASCII-Zeichen (zb 'a') ist einerseits der Buchstabe zugeordnet, andererseits auch die Nummer im Zeichensatz.
Bei zB a ist sie 97.

Und weil C/C++ so eine nette Sprache ist, kannst du es ohne weiteres in beiden Varianten verwenden, zB so:
C++:
pruef['a']=...;
Man muss nicht unbedingt eine Zahl als Index nehmen; hier wird dann eben 97 verwendet.

Setz zuerst alle 256 pruef-int auf 0, dann brauchst du nur noch sowas:
C++:
int i;
int len=strlen(Eingabe);

//Zuerst Nullsetzen
for(i=0;i<256;i++) pruef[i]=0;

//Jetzt den eigentlichen Code:
for(i=0;i<len;i++) pruef[ eingabe[i] ] ++;

Wirds so klarer?

Und um mienen Hinweis zu den negativen Zahlen noch zu beachten:
eingabe besteht eventuell aus signed chars, also -128 bis +127.
In pruef soll das aber von 0 bis 255 gehen, also muss negative Zahlen in 128-255 umrechnen

Also
C++:
for(i=0;i<len;i++) pruef[ (eingabe[i]<0)?(256+eingabe[i]):(eingabe[i]) ] ++;

Gruß
 
Hi sheel,
Einem ASCII-Zeichen (zb 'a') ist einerseits der Buchstabe zugeordnet, andererseits auch die Nummer im Zeichensatz.
Bei zB a ist sie 97.

Und weil C/C++ so eine nette Sprache ist, kannst du es ohne weiteres in beiden Varianten verwenden, zB so:
C++:
pruef['a']=...;
Man muss nicht unbedingt eine Zahl als Index nehmen; hier wird dann eben 97 verwendet.

Setz zuerst alle 256 pruef-int auf 0, dann brauchst du nur noch sowas:
C++:
int i;
int len=strlen(Eingabe);

//Zuerst Nullsetzen
for(i=0;i<256;i++) pruef[i]=0;

//Jetzt den eigentlichen Code:
for(i=0;i<len;i++) pruef[ eingabe[i] ] ++;

Wirds so klarer?

danke, beim mir ist eine art "A-Ha" effekt eingetreten. :) Ich bin immer davon ausgegangen, dass z.b. bei:

C:
printf("%i", pruef[15]);

der 15. feld ausgegeben wird, sprich bei int wäre es ja nur eine Zahl.
Der Index des pruef[], wird doch mit erhöht, oder?


Lg Bismark
 
In dem Fall ist es aber egal; du musst nicht -1 oder so rechnen.

Die 256 int von prüf haben die Indizes 0-255; und die möglichen Werte von einem eingabe-char sind auch0-255.
Passt perfekt zusammen.
 
Zurück