Wörter in 2D Array einlesen - C |
|
Wörter in 2D Array einlesen - C |
|
Hallo Leute!
Erstmal: ich bin ganz neu hier Razz
Ich studiere derzeit Elektrotechnik und versuche mich gerade an meiner SotwareTechnik Aufgabe.
Wir sollen ein Menü programmieren und dann mittels Menüpunkten bis zu 10 Wörter in ein 2 dimensionales Array einlesen und auch auslesen.
Die Menüführung mit Switch Case funktioniert, aber bei scanf hapert es derzeit irgendwie... Ich glaube ich habe ein Logik/Verständnisproblem.
Ich poste mal meine bisherige (noch fehlerhafte) Lösung:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
|
#include <stdio.h>
main ()
{
/* Variablendeklaration */
int menuPunkt;
char wortListe [9][9];
int i,j;
/* Wird so lange ausgeführt bis case 3 */
do{
printf("1.) Woerter eingeben \n");
printf("2.) Woerter ausgeben \n");
printf("3.) Programm beenden \n");
scanf("%d", &menuPunkt);
/*Switch Case */
switch(menuPunkt){
case 1 : printf("Woerter eingeben: \n");
for(i = 0; i < 10; i++)
for (j = 0; j <10; j++)
scanf("%c", &wortListe[i][j]);
break;
case 2 : printf("Woerter ausgeben: \n");
for(i=0; i<8; i++){
for(j=0; j<8; j++)
printf("%d ", wortListe[i][j]);}
printf("\n");
break;
case 3 : printf("Programm wird beendet! \n");break;
default: break;
}
} while (menuPunkt != 3);
} |
|
Habt ihr eine Idee wo mein Problem nun liegt?
Ich kriege meine Wörter nicht vernünftig eingelesen.
Für Hilfe und Denkanstöße wäre ich sehr dankbar!
Grüße, Marvin
|
|
24.11.2015 15:06 |
|
|
|
Dein Problem liegt wo anders:
code: |
1:
|
char wortListe [9][9]; |
|
und
code: |
1:
|
for(i = 0; i < 10; i++) //Zugriff |
|
Du solltest wortListe größer machen, aktuell geht sie nur von 0 bis 8.
__________________ Syntax Highlighting fürs Board (Link)
|
|
24.11.2015 17:08 |
|
|
|
Hallo, danke für die schnelle Antwort!
Ich hab es mittlerweile geschafft 10 Wörter einzugeben und auszugeben.
Hier mein Code:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
|
#include <stdio.h>
main ()
{
/* Variablendeklaration */
int menuPunkt;
char wortListe [9][20];
int i,j;
/* Wird so lange ausgeführt bis case 3 */
do{
printf("1.) Woerter eingeben \n");
printf("2.) Woerter ausgeben \n");
printf("3.) Programm beenden \n");
scanf("%d", &menuPunkt);
/*Switch Case */
switch(menuPunkt){
case 1 : printf("Woerter eingeben: \n");
for (i = 0; i < 10; i++)
scanf("%s", &wortListe[i][0]);
break;
case 2 : printf("Woerter ausgeben: \n");
for(i=0; i<10; i++){
printf("%s ", wortListe[i]);
printf("\n");}
break;
case 3 : printf("Programm wird beendet! \n");break;
default: break;
}
} while (menuPunkt != 3);
} |
|
Nun habe ich aber folgende Probleme:
1.) Ich schaffe es nicht ein Wort char - weise einzulesen und auszugeben. dieses Problem führt wiederum zu:
2.) Ich soll bei der Eingabe überprüfen ob ein "q" eingegeben wurde. Falls ja soll ich das ganze unterbinden.
Meine reine Eingabe und Ausgabe hab ich mit den Strings jetzt lösen kann, aber per scanf("%c", ....) schaffe ich es nicht.
Grüße, Marvin
|
|
24.11.2015 19:51 |
|
|
|
Hast du an sowas gedacht?
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
|
#include <stdio.h>
main ()
{
/* Variablendeklaration */
int menuPunkt;
char wortListe [10][20];
int i,j;
char c;
/* Wird so lange ausgeführt bis case 3 */
do{
printf("1.) Woerter eingeben \n");
printf("2.) Woerter ausgeben \n");
printf("3.) Programm beenden \n");
scanf("%d", &menuPunkt);
/*Switch Case */
switch(menuPunkt){
case 1 : printf("Woerter eingeben: \n");
while((c = getchar()) != '\n' && c != EOF); //flush input
for (i = 0; i < 10; i++) {
printf("%d. Wort: ", i+1);
j = 0;
while (j < 19) {
c = getchar();
if (c == '\n') break;
if (c != 'q') wortListe[i][j++] = c;
}
wortListe[i][j] = '\0';
}
break;
case 2 : printf("Woerter ausgeben: \n");
for (i = 0; i < 10; i++)
printf("%s\n", wortListe[i]);
break;
case 3 : printf("Programm wird beendet! \n");break;
default: break;
}
} while (menuPunkt != 3);
} |
|
__________________ Syntax Highlighting fürs Board (Link)
|
|
24.11.2015 20:05 |
|
|
|
Gehen wir die Sache mal durch:
Vom letzten Enter (Wahl der Zahl im Hauptmenü) hast du das Enter noch in der Eingabe hängen, das kommt bei getchar() als erstes. Das wollen wir nicht, also muss es weg, sonst ist das erste Wort schon zu Ende - einfach mal die Zeile auskommentieren und testen. EOF heißt end of file. Unter Windows kannst du die Zeile auch durch fflush(stdin) ersetzen. Dann läuft es bei mir aber nicht mehr, worüber ich nicht erfreut wäre.
printf("%d. Wort: ", i+1); schreibt 1. Wort, 2. Wort, ... Dient nur der Übersichtlichkeit beim Eingeben.
Dann gehen wir die Eingabe Zeichen für Zeichen durch. Wenn die Eingabe zu lang wird, brechen wir ab mit while (j < 19), da wir sonst in fremden Speicher schreiben würden. Auch beim Enter ('\n') wird abgebrochen. Anschließend noch das Zeichen schreiben, sofern kein 'q'. Gleichzeitig muss die Schreibposition mit j++ erhöht werden, sonst schreiben wir immer an die selbe Stelle.
Der string wird dann noch mit '\0' (gleichbedeutend der Zahl 0) abgeschlossen. So weiß printf, wann der string zu Ende ist. Hier muss das j nicht mehr erhöht werden, da wir mit dem Schreiben fertig sind, die Schreibposition also nicht mehr ändern müssen.
__________________ Syntax Highlighting fürs Board (Link)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von eulerscheZahl: 24.11.2015 20:47.
|
|
24.11.2015 20:46 |
|
|
|
Ok das verstehe ich nun. Aber damit setzen wir ja '\0' immer an "wortListe[i][20]" oder nicht?
|
|
24.11.2015 20:50 |
|
|
|
Du meinst wortListe[i][19]
Nicht, wenn der Nutzer schon vorher Enter gedrückt hat.
Die while Schleife wird bei j=19 oder bei Enter verlassen.
__________________ Syntax Highlighting fürs Board (Link)
|
|
24.11.2015 20:58 |
|
|
|
ok das verstehe ich jetzt auch.
Ich habe nun versucht auf Grundlage dessen meine Ausgabe charweise zu gestalten, da wir dir Ausgabe umdrehen sollen.
Wenn ich dies tu, kriege ich zwar die Wörter aber auch irgendwas dazwischen.
Das liegt daran, dass die Zeichen zwischen dem Ende des Wortes und '\0' nicht richtig definiert sind richtig? Meine Ausgabe sieht nämlich so aus:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
|
hallo▒▒▒▒
0▒
ichx▒$
Bin▒*▒▒▒▒
Marvin▒▒▒$
yo▒▒,▒
alles▒q▒▒
cooleASCII▒
es▒!!▒▒▒▒
klappt`▒$h▒2▒
jetzt$▒▒$ |
|
gelöst habe ich diesen Code durch:
code: |
1:
2:
3:
4:
5:
6:
|
case 2 : printf("Woerter ausgeben: \n");
for (i = 0; i < 10; i++){
printf("\n");
for (j = 0; j < 20; j++)
printf("%c", wortListe[i][j]);
}break; |
|
So richtig funktionieren tut das aber noch nicht....
Vielen Dank für die Erklärung und Geduld!
|
|
24.11.2015 21:03 |
|
|
|
Ok alles funktioniert jetzt. Wie schaffe ich es jetzt aber die restlichen undefinierten Stellen meines Arrays = '\0' zu setzen? Ich möchte meine Wörter umdrehen in der Ausgabe:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
|
case 2 : printf("Woerter ausgeben: \n\n");
for (i = 0; i < 10; i++){
printf("%d. Wort: ", i+1);
for (j = 20; j >= 0; j--){
if (wortListe != '\0')
printf("%c", wortListe[i][j]);}
printf("\n");
}break; |
|
Da kriege ich dann natürlich bis auf meine eingegeben Worte auch noch irgendwas undefiniertes raus.
|
|
24.11.2015 21:35 |
|
|
|
Zunächst einmal fängst du bei j=19 mit der Ausgabe an, nicht bei 20.
Wir hatten die Zeile
code: |
1:
|
wortListe[i][j] = '\0'; |
|
Das musst du einfach wiederholen bis einschließlich j=19.
__________________ Syntax Highlighting fürs Board (Link)
|
|
25.11.2015 06:13 |
|
|
|
Ich bin nun zu diesem (funktionierenden) Ergebnis gekommen.
Ich denke aber dass es noch nicht ganz optimal ist, da ich vieles durch Umwege lösen musste... Also sagen wir funktioniert, aber nicht gerade elegant
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
|
#include <stdio.h>
main ()
{
/* Variablendeklaration */
int menuPunkt;
char wortListe [10][20];
int i,j;
char c;
for (i = 0; i < 10; i++){
for (j = 0; j <= 20; j++)
wortListe[i][j] = '\0';
}
/* Wird so lange ausgeführt bis case 3 */
LOOP: do{
printf("\n1.) Woerter eingeben \n");
printf("2.) Woerter umgedreht ausgeben \n");
printf("3.) Programm beenden \n");
printf("\nIhre Auswahl: ");
scanf("%d", &menuPunkt);
printf("\nMenuepunkt %d\n\n", menuPunkt);
/*Switch Case */
switch(menuPunkt){
case 1 : printf("Woerter eingeben: \n\n");
while((c = getchar()) != '\n');
for (i = 0; i < 10; i++) {
printf("%d. Wort: ", i+1);
j = 0;
while (j < 20) {
c = getchar();
if (c == '\n') break;
if (c == 'q'){ printf("\n'q' ist nicht erlaubt!\n"); goto LOOP;}
else wortListe[i][j] = c;{
j++;}
}
wortListe[i][j] = '\0';
}
break;
case 2 : printf("Woerter umgedreht ausgeben: \n\n");
for (i = 0; i < 10; i++){
printf("%d. Wort: ", i+1);
for (j = 19; j >= 0; j--){
if (wortListe[i][j] != '\0')
printf("%c", wortListe[i][j]);}
printf("\n");
}break;
case 3 : printf("Programm wird beendet! \n");break;
default: break;
}
} while (menuPunkt == 1 || menuPunkt == 2);
if (menuPunkt != 1 && menuPunkt != 2 && menuPunkt != 3 ){
printf("Ungueltige Eingabe!\n");
goto LOOP;
}
} |
|
Ich habe nun aber das Problem, dass wenn ich menuPunkt einen String übergebe, mein SwitchCase in einen Loop verfällt. Woran liegt das?
|
|
25.11.2015 12:14 |
|
|
|
Deine Lösung geht so nicht:
Gib mal lange Worte ein und lasse sie ausgeben. Gib dann kurze Worte ein. Bei der Ausgabe wirst du noch den Rest des langen Wortes sehen.
Wenn du den Code so anpasst, dass du beim Einlesen den Rest mit 0en überschreibst, sieht das so aus:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
|
while (j < 19) { //kleiner 19, nicht 20, die '\0' zum Abschließen muss ja auch noch reinpassen!
c = getchar();
if (c == '\n') break;
if (c == 'q'){ printf("\n'q' ist nicht erlaubt!\n"); goto LOOP;} //PFUI!
wortListe[i][j] = c;
j++;
}
while (j < 20) {
wortListe[i][j] = '\0'; //den Rest überschreiben
j++;
} |
|
Und es würde mich erstaunen, wenn nicht explizit von goto abgeraten wurde. Das macht den Code unleserlich.
scanf erwartet eine Zahl, kriegt aber keine. Durch Drücken von Enter hast du die Eingabe beendet. Diese bleibt noch im Buffer und wird erneut geprüft.
Du kannst die Zeile while((c = getchar()) != '\n'); nach oben schieben (statt in case 1), dann wird die Eingabe entfernt.
__________________ Syntax Highlighting fürs Board (Link)
|
|
25.11.2015 17:25 |
|
|
|
Bei dieser Lösung überschreibt das Programm mir aber die restlichen Stellen nicht mit '\0'. Die Ausgabe spuckt mir wieder undefinierte Zeichen aus. Mein Code sieht nun so aus:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
|
#include <stdio.h>
main ()
{
/* Variablendeklaration */
int menuPunkt;
char wortListe [10][30];
int i,j;
char c;
/* Wird so lange ausgeführt bis case 3 */
LOOP: do{
printf("\n1.) Woerter eingeben \n");
printf("2.) Woerter umgedreht ausgeben \n");
printf("3.) Programm beenden \n");
printf("\nIhre Auswahl: ");
scanf("%d", &menuPunkt);
printf("\nMenuepunkt %d\n\n", menuPunkt);
/*Switch Case */
switch(menuPunkt){
case 1 : printf("Woerter eingeben: \n\n");
while((c = getchar()) != '\n');
for (i = 0; i < 10; i++) {
printf("%d. Wort: ", i+1);
j = 0;
while (j < 29) {
c = getchar();
if (c == '\n') break;
if (c == 'q'){ printf("\n'q' ist nicht erlaubt!\n"); goto LOOP;}
wortListe[i][j] = c;
j++;
}
while (j < 30) {
wortListe[i][j] = '\0'; /*den Rest überschreiben*/
j++;
} }
break;
case 2 : printf("Woerter umgedreht ausgeben: \n\n");
for (i = 0; i < 10; i++){
printf("%d. Wort: ", i+1);
for (j = 29; j >= 0; j--){
if (wortListe[i][j] != '\0')
printf("%c", wortListe[i][j]);}
printf("\n");
}break;
case 3 : printf("Programm wird beendet! \n");break;
default: break;
}
}while (menuPunkt == 1 || menuPunkt == 2);
} |
|
|
|
25.11.2015 17:47 |
|
|
|