amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Problem in C mit Whitespaces [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

27.04.2004, 11:55 Uhr

Patric_Kloeter
Posts: 167
[Ex-Mitglied]
Hallo Leute,

ich habe ein kleines Problemchen und vielleicht können mir die Programmierer unter Euch helfen. In C habe ich ein Programm geschrieben, dass verschiedene Elemente einliest und diese sortiert. Also eine normale sortierte Liste. Mit "e" oder "i" wird ein Element eingefügt, mit "d" oder "l" gelöscht und mit "q" oder "x" das Programm verlassen. Das Menü soll nur angezeigt werden, wenn eine andere Taste und dann Return, oder nur Return gedrückt wird. Soweit funktioniert es auch, ABER:

Wenn ich VOR dem e für einfügen oder d für löschen <TAB> oder <SPACE> eingebe und dann den Wert, wird das Menü so oft eingegeben, wie ich <TAB> oder die <SPACE> Taste gedrückt habe. Er ignoriert also nicht die Whitespaces. Meine Frage: Kann mir einer helfen und sagen, was ich machen muss, damit die Whitespaces ignoriert werden? Ich glaube irgendwas mit isspace oder so. Aber wie geht das genau?

Anbei hier mal das Rahmenprogramm mit dem Menü:

-----------

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(void)
{
char ch;
while(1){
printf("\n:");
fflush(stdin);
ch= getchar();
ch= tolower(ch);
switch(ch){

case'e':
case'i':
printf("\nEinfuegen");
/* Hier steht die Funktion Einfuegen */
printf("\n");
break;

case'd':
case'l':
printf("\nLoeschen");
/* Hier steht die Funktion Loeschen */
printf("\n");
break;

case'q':
case'x':
return 0;
break;

default:printf("Anwendung:\n");
printf(" E,e,I,i Schluessel zum Einfuegen \t z.B. e27 \n");
printf(" D,d,L,l Schluessel zum Loeschen \t z.B. d127 \n");
printf(" Q,q,X.x zum Beenden \n");
break;
}
}
fflush(stdin);
return 0;
}

--
Mfg

- CBM aka Patric Klöter

:commo: :dance1: AMIGA - keep the faith!

Web: http://www.commodore-amiga.de

[ - Antworten - Zitieren - Direktlink - ]

27.04.2004, 11:59 Uhr

tokai
Posts: 1071
Nutzer
code:
case 0x20: /* space     */ 
case 0x78: /* alt-space */
case 0x1B: /* tab       */
   break;

--
http://www.christianrosentreter.com



IRC: #amiganews.de @ARCNET (e.g. de3.arcnet.vapor.com/ port 6667)

[ Dieser Beitrag wurde von tokai am 27.04.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

27.04.2004, 12:14 Uhr

Solar
Posts: 3680
Nutzer
@ tokai:

Na super. Da ist CBM mit isspace() schon auf dem richtigen Weg (löblich!), und als Antwort bekommt er hartcodiertes ASCII hingeknallt... ?(

Davon ab erzeugt Dein 'break;' für jedes Whitespace eine neue Eingabeaufforderung...

@ CBM:

Ersetze:

ch= getchar();
ch= tolower(ch);

durch:

while ( isspace( ch = tolower( getchar() ) ) );

getchar() holt das nächste Zeichen, tolower() wandelt es um. Eine Zuweisung hat als Rückgabewert den zugewiesenen Wert (also ch). isspace() (aus ctype.h) gibt "true", wenn ch ein Whitespace ist - die Schleife endet also beim ersten eingegebenen Zeichen, für das isspace() false ist.

Ganz nebenbei erfolgt bei dieser Variante keine Ausgabe des default-Zweigs nach jeder Eingabe. ;)

[ Dieser Beitrag wurde von Solar am 27.04.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

27.04.2004, 15:21 Uhr

Patric_Kloeter
Posts: 167
[Ex-Mitglied]
Hallo Leute,

vielen Dank für die schnellen Antworten! Besonderen Dank an solar! :D

Habe die while Schleife eingefügt und es funktioniert bis auf einen kleinen Fehler: Normalerweise soll bei <Return> das Menü ausgegeben werden. Aber leider filtert isspace das ja auch raus. Ich hoffe, das bekomme ich noch hin. Falls noch wer eine Idee dazu hat, bin ich natürlich gespannt!
--
Mfg

- CBM aka Patric Klöter

:commo: :dance1: AMIGA - keep the faith!

Web: http://www.commodore-amiga.de

[ - Antworten - Zitieren - Direktlink - ]

27.04.2004, 16:10 Uhr

Patric_Kloeter
Posts: 167
[Ex-Mitglied]
Ich gebe hier mal ein Beispiel wie es sein soll:

Eingabe: <Enter>

Ausgabe: Default, hier also das Menü

Im Moment ist es so, dass es so aussieht:

Eingabe: <Enter>

Ausgabe: Keine, das Programm wartet, bis irgendein Zeichen eingegeben wird und dann <Return> gedrückt wird.

Wie schon von solar erwähnt, ignoriert das Programm auch ein eingebenes <Return>. Leider sind die Vorgaben so, dass auch ein nur eingebenes <Return> zum Default-Zweig springen soll. Gibts vielleicht noch 'ne andere Lösung als isspace, um sämtliche <TABS> und <SPACE> Zeichen zu ignorieren?
--
Mfg

- CBM aka Patric Klöter

:commo: :dance1: AMIGA - keep the faith!

Web: http://www.commodore-amiga.de

[ - Antworten - Zitieren - Direktlink - ]

27.04.2004, 16:25 Uhr

Solar
Posts: 3680
Nutzer
do
{
ch = tolower( getchar() );
} while ( isspace(ch) && ( ch != '\n' ) );

Ein Hinweis noch: fflush() ist für Ausgabestreams... und tut auf stdin angewendet nicht das, was Du erwartest. Solange also Deine 'case's nicht den Rest der Eingabe "fressen", solltest Du

do
{
ch = tolower( getchar() );
} while ( isspace(ch) && ( ch != '\n' ) );
while ( getchar() != '\n' );

schreiben. Sonst bekommst Du für die Eingabe "a" immer einen zweiten Durchlauf mit dem '\n'...

[ - Antworten - Zitieren - Direktlink - ]

27.04.2004, 16:43 Uhr

Patric_Kloeter
Posts: 167
[Ex-Mitglied]
@Solar:

ICH DANKE DIR! Jetzt macht das Programm alles wie es sein soll!

Vielen Dank! :rotate:
--
Mfg

- CBM aka Patric Klöter

:commo: :dance1: AMIGA - keep the faith!

Web: http://www.commodore-amiga.de

[ - Antworten - Zitieren - Direktlink - ]

27.04.2004, 17:07 Uhr

Solar
Posts: 3680
Nutzer
Ich danke Dir... ich hab' schon so lange nur noch mit <iostream> (C++) gearbeitet, das ich schon gar nicht mehr wußte, wie <stdio.h> von innen aussieht... ;-)

Noch ein Tip: http://www.dinkumware.com/manuals/reader.aspx?lib=c99...

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Problem in C mit Whitespaces [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.