Frage von 1Genius, 38

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

    #include<stdio.h>

int main(void){
    char text [128];
    int a, e, i, o, u;
    int j;
    
    scanf("%s", &text);
    
    
    
    for(j=0; j<127; j++){
        
        if(text[j] == 'a'||'A'){
            
            a++;
            
        }else if(text[j] == 'e'||'E'){
            
            e++;
            
        }else if(text[j] == 'i'||'I'){
            
            i++;
            
        }else if(text[j] == 'o'||'O'){
            
            o++;
            
        }else if(text[j] == 'u'||'U'){
            
            u++;
            
        }else{
            
        }
        
    }
    printf("Anz a: %d\n", a);
    printf("Anz e: %d\n", e);
    printf("Anz i: %d\n", i);
    printf("Anz o: %d\n", o);
    printf("Anz u: %d\n", u);
    
    return 0;
    
}

das ganze ist in c geschrieben

schon mal danke im Vorraus :)

Antwort
von droeme, 8

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
von Suboptimierer, 22
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
von TeeTier, 22

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. :)

Kommentar von 1Genius ,

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

Antwort
von Gastnr007, 26

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
von 1Genius, 20
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
von ASANGO, 25

Was gibt er denn aus?

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten