Hallo kann mir wer sagen warum mein Programm das die Anzahl der Vokale in einem kurzen Text zählen sollte nicht funktioniert?

... komplette Frage anzeigen

5 Antworten

Hallo 1Genius,

das Problem steckt hier:

 int a, e, i, o, u;

Du definierst fünf Variablen, ohne diese zu initialisieren. D.h. du reservierst Speicher für die Variablen, überschreibst deren Wert aber nicht mit 0.

Dies hat zur Folge, dass der aktuelle Wert an der Speicherstelle, welche reserviert wurde als Integer interpretiert wird, also ein mehr oder weniger zufälliger Startwert existiert. Diesen erhöhst du dann durch das Zählen im Programm und erhältst so diese seltsamen Werte.

Lösen kannst du das Problem ganz einfach durch eine Initialisierung der Variablen vor der Benutzung:

int a=0, e=0, i=0, o=0, u=0;

Bei den If-Abfragen solltest du wie von den anderen Antwortschreibern erwähnt die Langform benutzen.

Schöne Grüße,
droeme

Antwort bewerten Vielen Dank für Deine Bewertung
text[j] == 'o'||'O'

Ich weiß nicht, wie tolerant C da ist, aber in den meisten anderen Programmiersprachen würde man das, was sprachlich abgekürzt wird, ausschreiben müssen. 'o' || 'O' ergibt keinen Sinn, da || ein logischer Operator ist. o.O

(text[j] == 'o') || (text[j] == 'O')

PS: Gibt es in C nicht als Stringterminierer das 0-Byte? Wenn ja, solltest du die Untersuchung abbrechen, wenn der Terminator erreicht wurde:

for(j=0;(j < 127) && (Text[j] != 0);j++){

(ungetestet, evtl. '\\0')

Antwort bewerten Vielen Dank für Deine Bewertung

ich bin nicht der c-Typ, aber zumindest sollte es <=127 oder <128 sein

du kannst ja auch dein Char-Array mal von Anfang an festlegen :)

Antwort bewerten Vielen Dank für Deine Bewertung

Anstatt ...

text[j] == 'a'||'A'

... muss es ...

text[j] == 'a' || text[j] == 'A'

... heißen. :)

Stattdessen kannst du auch am Anfang einmalig ...

char c = text[j];

... schreiben, und dann ist später in jeder Bedingung nur noch ...

c == 'a' || c == 'A'

... nötig.

Noch besser wäre, wenn du am Anfang ctype.h mit ...

#include <ctype.h>

... einbindest, und dann ...

char c = tolower(text[j]);

... und später tatsächlich nur noch ...

if (c == 'a') ...

... schreiben musst, womit du dann logischerweise trotzdem Groß- und Kleinbuchstaben abdeckst. :)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von 1Genius
08.03.2016, 21:01

habs jetzt so gemacht aber die ausgabe passt noch nicht :

bei hallo gibt er zum beispiel aus:

$ \a
hallo
Anz a: 2
Anz e: 0
Anz i: 2
Anz o: 1
Anz u: 1

0
for(j=0; j<127; j++){

char c = text[j];

if(c == 'a'|| c == 'A'){

a++;

}else if(c == 'e'|| c == 'E'){

e++;

}else if(c == 'i'|| c == 'I'){

i++;

}else if(c == 'o'|| c == 'O'){

o++;

}else if(c == 'u'|| c == 'U'){

u++;

ausgabe passt noch nicht :

bei hallo gibt er zum beispiel aus:

$ \\a
hallo
Anz a: 2
Anz e: 0
Anz i: 2
Anz o: 1
Anz u: 1

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?