Anzahl Buchstaben aus Array C

Panda90

Cadet 2nd Year
Registriert
Okt. 2010
Beiträge
25
Guten Tag,
Bin derzeit dabei mich ein wenig mehr mit der Sprache C zu beschäftigen und stoße grade auf ein ( für mich =P ) Problem.

Ich habe ein Array mit einem Satz befüllt.
In dem Falle char satz[] = "Guten Tag an alle"
nun will ich ein int array anlegen, dass die Anzahl der einzelnen Buchstaben ( also z.b. 2xe ) beinhaltet.

wie bekomme ich das denn hin? bin schon bisschen länger an dem problem aber finde irgendwie keinen lösungsansatz.
das einzige was ich bisher habe ist:

char satz[] = "Guten Tag an alle";
int anzahl[26];
int i;


printf("Der Satz lautet: --> %s <--\n", satz);

for(i=0; i<=satz; i++) // durchlaufe ich so das array satz[] ??
{
// hier rein wollte ich jetzt irgendwas schreiben, dass mir die Buchstaben zählt nur leider keine idee = /
}


vielleicht könnt ihr mir da ja weiter helfen. :D

MfG
Panda
 
Das einfachste waere die Funktion isAlpha(int i) zu verwenden. Dazu musst du cctype.h einbinden und das Problem loest sich dann wie folgt:

Code:
int anzahlBuchstaben=0;
for(i=0; i<strlen(satz); i++) // durchlaufe ich so das array satz[] ??
{
     if(isalpha(satz[i])
          anzahlBuchstaben++;
}

Somit haettest du die Anzahl der Buchstaben in der passenden Variable.

EDIT: damit du weisst wie lange dein Satz ist kannst du noch mit strlen die Laenge des Satzes ermitteln
 
Zuletzt bearbeitet:
So dürfte es gehen:
Code:
int main ()
{
	char satz[] = "Guten Tag an alle";
	int anzahl[26] = {0};
	int i;


	printf("Der Satz lautet: --> %s <--\n", satz);

	// buchstaben zählen
	for(i = 0; i < strlen(satz); i++)
	{
		char c = satz[i];

		if(c >= 'a' && c <='z')
			anzahl[c-'a']++;

		if(c >= 'A' && c <='Z')
			anzahl[c-'A']++;
	}

	// ergebnis anzeigen
	for(i=0;i<26;i++)
	{
		printf("%c: %i\n", i+'a', anzahl[i]);
	}

	return 0;
}
 
Am einfachsten wäre es so: Du hast ein Array mit 255 Elementen (da [unsigned] char 255 Werte aufnehmen kann) und gehst das Wort mittels einer Schleife durch. Dann kannst du einfach über eine Inkrementation von
Code:
++anzahl[satz[i]]
die Zeichenanzahl erhöhen. Wichtig dabei ist natürlich, dass jedes Element vorher mit 0 initialisiert wird.
 
hätte ich dann damit quasi das "a" in der variablen "i" gespeichert oder wie darf ich mir das vorstellen? Sorry für so (vielleicht) dumme fragen aber ich bin noch nicht so lange am C lernen = /

edit: bezog sich auf den beitrag von toxn
 
Keine Ahnung was du jetzt mit a in i meinst aber:

Mal angenommen:

satz = "hallo"

dann wäre ja satz im ersten durchlauf = 'h'

++anzahl[satz] bedeutet also ++anzahl['h'] (kann C assoziative arrays? Mache aktuell nur C#)

Frage wäre dann auch noch ob du zwischen Groß und Kleinbuchstaben unterscheiden willst.
 
@Panda90

Nein, das i ist lediglich ein Index welcher auf eine Position in deinem Array verweist.
char[] satz = "hallo"
satz[0] = 'h'
satz[1] = 'a'
usw...

Somit gelangst du an die einzelnen Elemente aus deinem Array und diese werden dann jeweils in der isaplpha funktion ueberprueft. Aber du hast scheinbar noch so gut wie keine Kenntnisse und solltest dich ersteinmal mit Arrays im Allgemeinen beschaeftigen
 
eigentlich sollte es doch reichen ein Array mit 52 elemten zu nehmen.
dann erhöht man einfach an der Stelle anzahl[satz - 'A'] bzw. anzahl[satz - 'a' + 'A'](wenn man zwischen groß und kleinschreibung unterschiedet)
Wäre jetzt mein Gedankenansatz
 
NoD.sunrise schrieb:
kann C assoziative arrays?
char ist nix anderes als ein int, nur das die Repräsentation eine andere ist. Der Wertebereich reicht von (signed) -128 bis 127 bzw. von (unsigned) 0 bis 255. Caste ein char einfach mal in ein int und lass es dir ausgeben.
 
Der TE hat ein Array wobei platz 0 für die anzahl As steht und 25 für die Zs im Satz. Oder?

den Vorschlag von cx01 finde ich am besten.

@Black_Panter glaube das würde nur gehen wenn zwischen Z und a nichts stehen würde, jedoch Sind da zeichen dazwischen
 
Zuletzt bearbeitet:
@ Panda90

Jetzt hab auch ichs verstanden. Meine Variante zaehlt lediglich die Anzahl der Buchstaben nicht aber jeden einzelnen. Die Variante von cx01 ist wohl am besten.
 
erstmal vielen dank an alle für die antworten (=
hab jetzt die variante von cx01 übernommen und es klappt wunderbar, versuche sie jetzt so zu modifizieren, dass er mir nicht immer ALLE buchstaben anzeigt, sondern nur die, die auch im satz stehen.
und ich versuche erstmal richtig den sinn dahinter zu verstehen ;)
 
Switch case a bis z plus sonderzeichen ( arrayende war doch slash oder so) für break??
Bei

Code:
x=0
i=0
do{
  Switch case satz[i]
    case 'a' anzahl[0]=anzahl[0]+1; i++; break;
    case 'b' anzahl[1]=anzahl[1]+1; i++; break;
    [...]
    case '\0' x++; break;}
  while(x==0)

*edit1:
Vergiss nicht wegen Sonderzeichen (leerzeichen etc) ein default einzubauen, mit nur i++.

So würd ich das machen.

*edit2:
Endmarker ist '\0'
 
Zuletzt bearbeitet:
cx01 schrieb:
So dürfte es gehen:
Code:
	// buchstaben zählen
	for(i = 0; i < strlen(satz); i++)

davon ist prinzipiell abzuraten, da bei jeder iteration ein strlen() ausgewertet wird (was leistung kostet und in dem fall unnötig ist).

sinnvoller:
Code:
	// buchstaben zählen
	int len = strlen(satz);
	for(i = 0; i < len; i++)

eine andere methodik, die sogar noch mehr speed liefert ist:
Code:
	const char *pos = satz;
	while (*pos != '\0') {
		char c = *pos++;
		...
	}
 
Warum wollt ihr zählen??? Die letzte Position in einem array hat doch IMMER ein spezielles Symbol, bei dem man einfach aussteigen kann? Warum wollt ihr alle den Array mehr als 1 mal durchgehen?
Meins ist ganz sicher nicht ideal (IT-SE gelernt und nicht viel mit Programmieren zu tun), aber unser Lehrer sagte, switch case sei schneller als divers verschachtelte "if"s.
Und in meinem Beispiel, welches zugegeben horrend viel Code ist, wird der String/das char Array nur einmal durchlaufen.
Wie gesagt, ich bin kein Coder, aber vielleicht könnt ihr ja Begründen, warum euch die Länge überhaupt interessiert?!

*edit1:
Der letzte Eintrag eines Arrays sollte '\0' sein. Ja, das ist "ein Zeichen".
http://en.wikibooks.org/wiki/C_Programming/Arrays
 
Zuletzt bearbeitet:
Merle schrieb:
Warum wollt ihr zählen??? Die letzte Position in einem array hat doch IMMER ein spezielles Symbol, bei dem man einfach aussteigen kann?! Warum wollt ihr alle den Array mehr als 1 mal durchgehen...
[...]
Und in meinem Beispiel, welches zugegeben horrend viel Code ist, wird der String/das char Array nur einmal durchlaufen.
Wer geht denn das Array mehrmals durch? Ich sehe bei jedem immer nur eine Schleife und keiner iteriert mehrfach.
Merle schrieb:
Meins ist ganz sicher nicht ideal (IT-SE gelernt und nicht viel mit Programmieren zu tun), aber unser Lehrer sagte, switch case sei schneller als divers verschachtelte "if"s.
Geschwindigkeit in allen Ehren, aber dein Code ist sau schlecht zu warten. Lieber verzichte ich auf Performance und verwende das angesprochene isAlpha().
Merle schrieb:
Wie gesagt, ich bin kein Coder, aber vielleicht könnt ihr ja Begründen, warum euch die Länge überhaupt interessiert?!
Damit man weiß wo der String aufhört und der Index angesprochen werden kann und damit die for-Schleife indexbasierend arbeiten kann. Die beste Lösung ist die Letzte von IceMatrix, allerdings wird diese für jeden Anfänger undurchsichtig sein. Der Pointer zeigt im Prinzip auf jeweils ein Zeichen und dank Pointer-Arithmetik, kann man diese einfach inkrementieren und somit springt dieser auf die nächste Stelle im (hier) Array. Der Zugriff hierbei ist um ein vielfaches schneller, allerdings muss man erstmal wissen was dies bedeutet.
 
Ja ok, alles klar, danke.
Ja, das mit den Pointern versteh ich... Und auch das mit strlen ergibt Sinn, wenns eben nur einmal durchgeführt wird mit genannetem Zweck...
Und nachdem ich das von cx01 gerade auch verstanden habe (nicht schlecht!) ist es mir auch logischer.

Danke für die Erläuterung.
 
Yuuri schrieb:
Wer geht denn das Array mehrmals durch? Ich sehe bei jedem immer nur eine Schleife und keiner iteriert mehrfach.

du siehst die mehrfache iteration nicht, weil sie durch strlen() versteckt wird. dort findet nämlich auch eine iteration statt.
 
Zurück
Oben