Frage zu strings!
-
ich habs jetzt ungefähr so gemacht:
char string[100]; //zum einlesen des wortes int main(){ printf("Bitte geben sie ein Wort ein (nicht größer als 100 Buchstaben) ==>"); gets(string); toupper(string); zeichen_lesen(); } int zeichen_lesen(){ int i; while(i<=100){ i++; unsigned char zeichen = string[i]; if (zeichen=='A') A_ausgabe(); if (zeichen=='B') B_ausgabe(); if (zeichen=='C') C_ausgabe(); if (zeichen=='D') //ganze ABC durch
Nur kleines problem er geht ned weiter in die zeichen_lesen funktion! und tut nichts mehr
ihr werdet euch jetzt sicher fragen warum der so viele vergeleiche macht? ich habe letzte woche ein hü bekommen wo ich ein wort ungefähr so darstellen musste:
HH HH TTTTTTTTTT LL
HH HH TTTTTTTTTT LL
HH HH TT LL
HHH HH HHH TT LL
HHHH HHHH TT LL
HH HH TT LL
HH HH TT LLLLLLLL
HH HH TT LLLLLLLLLdas möchte ich jetzt noch mit einer eingabe verknüpfen! :p
edit:
(muss man auf einer kosolen schriftart machen! ^^)
-
Erstens: Nimm lieber fgets(), damit kannst du auch kontrollieren, wieviel maximal eingelesen wird.
Zweitens: man: toupper macht bestimmt nicht das, was du vorhast.
Drittens: Anstelle der vielen if() würde ich ja ein switch() hinsetzen.
Viertens: Was sagt dein Debugger? Du könntest ein leichtes Problem damit bekommen, daß i nicht initialisiert wird (und daß Array-Indizes von 0 bis n-1 gerechnet werden).
-
CStoll schrieb:
Erstens: Nimm lieber fgets(), damit kannst du auch kontrollieren, wieviel maximal eingelesen wird.
OK! werde ich machen!
CStoll schrieb:
Zweitens: man: toupper macht bestimmt nicht das, was du vorhast.
Da bin ich auch grade draufgekommen
CStoll schrieb:
Drittens: Anstelle der vielen if() würde ich ja ein switch() hinsetzen.
switch hab ich mir ncoh ncith angesehn deshalb die vielen if's werde mir die funktion aber gleich reinziehn!
CStoll schrieb:
Viertens: Was sagt dein Debugger? Du könntest ein leichtes Problem damit bekommen, daß i nicht initialisiert wird (und daß Array-Indizes von 0 bis n-1 gerechnet werden).
Debugger sagt nichts
-
toupper funzt ned! Compiler sagt nichts hier noch mal der code:
#include<stdio.h> #include<conio.h> #include<string.h> #include<ctype.h> char string[100]; //zum einlesen des wortes int i=0; int main(){ printf("Bitte geben sie ein Wort ein (nicht groeser als 100 Buchstaben) ==>"); fgets(string, 100, stdin); zeichen_lesen(); } int zeichen_lesen(){ char zeichen = string[i]; int toupper(int zeichen); printf("%c", zeichen); getch(); } switch (zeichen){ case 'A':A_ausgabe(); case 'B':B_ausgabe(); case 'C':C_ausgabe(); case 'D':D_ausgabe(); //usw...
-
Ja klar - du hast ja auch nur eine lokale Funktion mit diesem Namen deklariert. Anwenden könntest du das z.B. so:
for(int i=0;string[i]!='\0';++i)//kompakter als deine while()-Version) { char zeichen = toupper(string[i]); switch(zeichen) { case 'A': A_Ausgabe();break;//die break's sind wichtig case 'B': B_Ausgabe();break; ... default : keine_Ausgabe();break; } }
-
JOP! ES FUNKTIONIERT JETZT MUSS ICH NUR MEHR DIE BUCHSTABEN GESTALTEN!^^ hab die for schleife allerdings weggeslassen die brauche ich ned !
DANKE!!!!!!!!!!!!hier jetzt der fertige Code:
#include<stdio.h> #include<conio.h> #include<string.h> #include<ctype.h> char string[100]; //zum einlesen des wortes int i=0; int main(){ printf("Bitte geben sie ein Wort ein (nicht groeser als 100 Buchstaben) ==>"); fgets(string, 100, stdin); zeichen_lesen(); } int zeichen_lesen(){ char zeichen; zeichen = toupper(string[i]); switch (zeichen){ case 'A':A_ausgabe();break; case 'B':B_ausgabe();break; case 'C':C_ausgabe();break; case 'D':D_ausgabe();break; case 'E':E_ausgabe();break; case 'F':F_ausgabe();break; case 'G':G_ausgabe();break; case 'H':H_ausgabe();break; case 'I':I_ausgabe();break; case 'J':J_ausgabe();break; case 'K':K_ausgabe();break; case 'L':L_ausgabe();break; case 'M':M_ausgabe();break; case 'N':N_ausgabe();break; case 'O':O_ausgabe();break; case 'P':P_ausgabe();break; case 'Q':Q_ausgabe();break; case 'R':R_ausgabe();break; case 'S':S_ausgabe();break; case 'T':T_ausgabe();break; case 'U':U_ausgabe();break; case 'V':V_ausgabe();break; case 'W':W_ausgabe();break; case 'X':X_ausgabe();break; case 'Y':Y_ausgabe();break; case 'Z':Z_ausgabe();break; } } int A_ausgabe(){ char stringA[]="AAAAAAAAAAA"; char A[11]; i++; zeichen_lesen(); // geht noch weiter mit den funktionen
-
Gimmli schrieb:
hab die for schleife allerdings weggeslassen die brauche ich ned !
Wieso das? Die ist auf jeden Fall besser als deine Rekursion.
-
'for' loop initial declaration used outside C99 mode
spukt mir der compiler mit der schleife aus!
-
Du darfst nach dem alten Standards (C89 bzw. C90) Variablen nicht innerhalb der Schleife deklarieren. Das geht nur im aktuellen Standard C99.
// Variante in C89/90 void func(void){ int i; // ... for(i=0; i<foo; i++){ // ... } } // Variante in C99 void func(void){ // ... for(int i=0; i<foo; i++){ // ... } }
(selbstverständlich ist die C89-Variante auch in C99 gültig)
Zur Lösung des Problems kannst du entweder den Code so umbauen, dass er der C89-Variante genügt, oder deinen Compiler in den C99-Modus schalten (C99 unterstützt er wohl, sonst sähe die Warnung ja anders aus). Beim gcc/MinGW geht das z.B. mit -std=c99.
-
hmmm.... schleife funktioniert noch immer nicht
ich benutze Dev-Cpp wo soll ich das auf C99 umstellen?!?!
Hier nochmal der code so wie ich ihn jetzt habe(noch mit while schleife):
//.. int zeichen_lesen(){ char zeichen; while(i<=100){ zeichen = toupper(string[i]); i++; switch (zeichen){ case 'A':A_ausgabe();break; case 'B':B_ausgabe();break; case 'C':C_ausgabe();break; case 'D':D_ausgabe();break; case 'E':E_ausgabe();break; case 'F':F_ausgabe();break; case 'G':G_ausgabe();break; //..
auserdem bekomme ich diesen fehler:
[Warning] implicit declaration of function `A_ausgabe' [Warning] implicit declaration of function `B_ausgabe' ...
PROGRAMM FUNZT JETZT VOLL!!!! zwar mit while schleife aber ja .... so ist es jetzt einsatz bereit1 DANKE FÜR EURE HILFE!!!!!!!!!!
-
Vielleicht solltest du die Funktionen A_ausgabe() etc mal vor der main() deklarieren (Stichwort: Prototyp), dann muß der Compiler nicht raten, womit er es zu tun hat.