• 18.04.2024, 22:57
  • Registrieren
  • Anmelden
  • Sie sind nicht angemeldet.

 

Lieber Besucher, herzlich willkommen bei: Aqua Computer Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

Problem mit C [Linux/Windows]

Montag, 24. November 2008, 19:12

Nabend. Ich hab hier ein kleines C-Programm, welches unter Windows auch genau so läuft, wie es soll.

Quellcode

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
#include <stdio.h>

/* Anzeige eines Stundenplans gemaess der Angaben auf Uebungsblatt 4, Aufgabe 1.*/

int main (void)
{
    char auswahl;
    int wochentag,i=1;

    while(i==1){
    fflush(stdin); /*Leerung der Standardeingabe*/

    printf("Fuer welchen Wochentag soll der Stundenplan angezeigt werden?\n Bitte waehlen Sie: \n\n A Montag\n B Dienstag\n C Mittwoch\n D Donnerstag\n E Freitag\n F Samstag\n G Sonntag\n X Beenden\n");
    printf("Ihre Eingabe: ");
    scanf("%c", &auswahl);

    /*Umwandlung des Wochentages in eine ganze Zahl für die switch-Anweisung*/
    if (auswahl=='A') wochentag=1; else
    if (auswahl=='a') wochentag=1; else
    if (auswahl=='B') wochentag=2; else
    if (auswahl=='b') wochentag=2; else
    if (auswahl=='C') wochentag=3; else
    if (auswahl=='c') wochentag=3; else
    if (auswahl=='D') wochentag=4; else
    if (auswahl=='d') wochentag=4; else
    if (auswahl=='E') wochentag=5; else
    if (auswahl=='e') wochentag=5; else
    if (auswahl=='F') wochentag=6; else
    if (auswahl=='f') wochentag=6; else
    if (auswahl=='G') wochentag=7; else
    if (auswahl=='g') wochentag=7; else
    if (auswahl=='X') wochentag=0; else
    if (auswahl=='x') wochentag=0; else
                      wochentag=8;

    /*Ausgabe des taeglichen Stundenplans*/
    switch(wochentag){
        case 1: printf("Stundenplan vom Montag\n -------------------\n 10 - 13 Uebung: ETA\n 13 - 15 Uebung: GdI\n -------------------\n \n"); i=1; break;
        case 2: printf("Stundenplan vom Dienstag\n -------------------\n 08 - 10 Vorlesung: Info1\n 10 - 12 Uebung: Info1\n -------------------\n \n"); i=1; break;
        case 3: printf("Stundenplan vom Mittwoch\n -------------------\n 08 - 11 Vorlesung: ETA\n 12 - 14 Vorlesung: Mathe A\n -------------------\n \n"); i=1; break;
        case 4: printf("Stundenplan vom Donnerstag\n -------------------\n 08 - 10 Vorlesung: Info1\n 10 - 12 Vorlesung: Mathe A\n -------------------\n \n"); i=1; break;
        case 5: printf("Stundenplan vom Freitag\n -------------------\n 08 - 10 Vorlesung: GdI\n 10 - 12 Vorlesung: Mathe A\n -------------------\n \n"); i=1; break;
        case 6: printf("Der Samstag ist vorlesungsfrei.\n\n"); i=1; break;
        case 7: printf("Der Sonntag ist vorlesungsfrei.\n\n"); i=1; break;
        case 0: printf("Sie verlassen nun das Stundenplanmenue. Auf Wiedersehen.\n\n"); i=0; break;
        default: printf("Falsche Eingabe.\n\n"); i=1; break;
    }}
 return 0;
}


Wenn ich das ganze unter Windows ablaufen lasse startet das Programm normal. Die Eingabeaufforderung wird angefordert und es wird genau ein Tag angezeigt. Bei Eingabe von 'A' also der Stundenplan vom Montag.
Wenn ich das ganze nu auf meinem Linux kompiliere und starte wird bei der Eingabe von 'A'
1) Der Stundenplan vom Montag ausgegeben.
2) Eine Ausgabe "Falsche Eingabe" (sprich

Quellcode

1
default: printf("Falsche Eingabe.\n\n"); i=1; break;
ausgegeben.

Anschließend kann ich eine neue Eingabe machen, wie es sich auch gehört. Ich denke, dass der Fehler bei der Unixverwertung des Enters/Zeilenumbruchs liegt.
Wie kriege ich das Programm nun dazu auch unter Linux vernünftig zu laufen?

Und ja, es handelt sich um eine Übungsaufgabe der Uni.. Bevor Fragen aufkommen. Allerdings ist die Aufgabe im Prinzip schon gelöst, also ist Hilfe durchaus ok ;) ;D

r4p

Senior Member

Re: Problem mit C [Linux/Windows]

Montag, 24. November 2008, 20:04

Hab mal schnell gegoogleld(?):

hier sind meiner Meinung nach eine ganze menge brauchbare Lösungen dabei.

void chomp(string); sieht vorallem ganz komfortabel aus.

Gruß raptor, der ebenfalls an C für die Uni hängt.
Gentoo nutzer mit Herz und Seele: Gentoo Gentoo Wiki

"Bei der Eroberung des Weltraums sind zwei Probleme zu lösen: die Schwerkraft und der Papierkrieg. Mit der Schwerkraft wären wir fertig geworden." - Wernher von Braun

Re: Problem mit C [Linux/Windows]

Montag, 24. November 2008, 20:12

Lass dir mal den Wert von `auswahl` und `wochentag` zwischen `if`-Block und `switch`-Statement geben.

Ich vermute, die Schleife wird zweimal durchlaufen.

Re: Problem mit C [Linux/Windows]

Montag, 24. November 2008, 20:34

Jop, die Schleife wird unter Linux zweimal durchlaufen, wobei die 1. Eingabe der Eingabe entspricht und die 2. Eingabe das Entersymbol/<Return> ist. Aber das warum ist mir nicht ganz klar.
Kann es daran liegen, dass ich per putty aufs Linux zugreif?

@raptor: Den Befehl hatten wir noch nicht, also muss es auch ohne klappen. Unter Windows funktioniert es ja auch :/

Re: Problem mit C [Linux/Windows]

Montag, 24. November 2008, 21:21

Das kann sein, kann aber auch unter UNIX generell anders sein.

Lass dir doch mal das zweite Zeichen bzw. dessen ASCII-Code ausgeben, dann sind wir schlauer. Es ist wohl `\r` oder `\n`. Sobald du es weißt, kannst du es ja abfangen, also etwa frühzeitig mit einem `continue` den aktuellen Schleifendurchlauf abbrechen.

Re: Problem mit C [Linux/Windows]

Montag, 24. November 2008, 21:49

Es wird tatsächlich das Ascii-Zeichen 10 (Dezimal) beim 2. Durchlauf benutzt, also der Linefeed.
Wie genau soll ich die Schleife denn per 'continue' abbrechen bzw. wo soll ich dieses Zeichen setzen? Das ist mir gerade nicht so ganz klar :/

Re: Problem mit C [Linux/Windows]

Montag, 24. November 2008, 21:52

Direkt nach dem `scanf()`:

Quellcode

1
2
3
4
if (auswahl == '\n') {
    // Skip this junk.
    continue;
}


Noch eine Frage: Wird zwischen 1) und 2) der Prompt "Ihre Eingabe:" erneut angezeigt? Soweit ich den Code ersehe, müsste das der Fall gewesen sein.

Re: Problem mit C [Linux/Windows]

Dienstag, 25. November 2008, 00:55

Ja, "Ihre Angabe" wird zweimal angezeigt, die komplette Schleife wird nochmals durchlaufen :/

Irgendwie klappt es auch mit deinem Tipp nicht, die Schleife wird trotzdem doppelt durchlaufen.

Ich glaub ich werd morgen mal meinen Tutor fragen ob er eine Idee hat, wie ich den Fehler wegkriege.

Re: Problem mit C [Linux/Windows]

Dienstag, 25. November 2008, 11:20

nicht die schoenste methode, aber mit gets klappts bei mir unter win & linux.

Re: Problem mit C [Linux/Windows]

Dienstag, 25. November 2008, 17:23

Also die passende Lösung war zu einfach.

Quellcode

1
scanf(" %c", &auswahl);
funktioniert.

also einfach vor das % ein Leerzeichen setzen, schon wird nur noch das erste eingegebene Zeichen benutzt.. :p

Re: Problem mit C [Linux/Windows]

Dienstag, 25. November 2008, 17:58

Mal ne andere Frage: Hat diese "Umwandlung" der Eingabe in eine Zahl über diese if-else Passage irgendeinen Sinn (irgendwie von der Aufgabenstellung gefordert)?
Imo ist das völlig überflüssig ;)
C programmers never die. They are just cast into void. Neues moddingtech.de Portal online!

Re: Problem mit C [Linux/Windows]

Dienstag, 25. November 2008, 18:01

Nein, die hat keinerlei Sinn und ist inzwischen auch rausgeflogen. Dafür kamen einige case(' ') dazu.

Re: Problem mit C [Linux/Windows]

Mittwoch, 26. November 2008, 14:20

Wenn ihr sowas schon hattet bzw. schon benutzen dürft kannst Du die Eingabe mit z.B. strtolower() auch in Kleinbuchstaben umwandeln und brauchst dann nur noch diese cases prüfen...
C programmers never die. They are just cast into void. Neues moddingtech.de Portal online!

Re: Problem mit C [Linux/Windows]

Mittwoch, 26. November 2008, 16:54

strtolower? vermutlich meinst du tolower().

Re: Problem mit C [Linux/Windows]

Mittwoch, 26. November 2008, 19:57

es gibt strtolower - ist aber bei mir als Linuxfunktion markiert. ;)
Suche Bücher von Tanenbaum und Galileo (auch Video-Training) - bitte KM! [img] http://www.aqua-computer-berlin.de/logo.png [/img]

Re: Problem mit C [Linux/Windows]

Mittwoch, 26. November 2008, 21:09

Zitat von »Katzenfreund«

es gibt strtolower - ist aber bei mir als Linuxfunktion markiert. ;)

also wenn ich das bei google suche gibts nur php eintraege. und php.. darueber muessen wir denke ich nicht sprechen, oder?

Re: Problem mit C [Linux/Windows]

Donnerstag, 27. November 2008, 19:14

Ja sorry, ich meinte tolower(). strtolower ist tatsächlich die php-Variante davon ;) ;D
Falls die Benutzung dieser Funktion nicht erlaubt ist kann man sich mit Kenntnis der ASCII-Tabelle sowas übrigens auch ganz leicht selber schreiben.
C programmers never die. They are just cast into void. Neues moddingtech.de Portal online!