Problem mit Escape-Sequncen in C - Help!

T

Thomas_xp

Aktives Mitglied
Thread Starter
Dabei seit
05.04.2006
Beiträge
632
Reaktionspunkte
13
In C (Porgrammierung) soll eine Zeichenfolge die mit einem ENTER "eingegeben" wird (also "ajfajsffa" "Enter") weiterverarbeitet werden. Dazu möchte ich eine while-Schleife starten die alle Zeichen aus dem Buffer liest bis keines mehr da ist. Ich dachte an soetwas:
while(x=(getc(stdin)!=CR))

Dabei ist CR ja das ASCII "Enter" bzw Zeilenumbruch. Nun wird das aber nicht erkannt! EOF wird erkannt, aber alle Escapesequencen aus ASCII nicht.
Was mache ich falsch?

Die while-Schleife soll beendet werden, sobald keine richtigen Zeichen mehr im Buffer sind. Außerdem wird das geholte Zeichen, welches sich auf X befindet noch auf gewisse eigenschaften geprüft.
 
Hm? Was zum Deibel ist denn CR? Wo ist das definiert/deklariert?
Und vermutlich meinst du eher
Code:
while ((x=getc(stdin))!='\n') { foobar(x); }

Gruß && HTH,
/dev
 
CR = carriage return = Naechste Zeile ;)
 
Aha. Und funktionierts jetzt? ;)

Gruß,
/dev
 
Hm? Was zum Deibel ist denn CR? Wo ist das definiert/deklariert?
Und vermutlich meinst du eher
Code:
while ((x=getc(stdin))!='\n') { foobar(x); }

Gruß && HTH,
/dev

Das {foobar(x);} hat hier keinen Einfluss auf die while-Schleife und sollte nur ein Beispiel sein richtig?

Habe es mit CR versucht ohne Erfolg. Auch \n hat nicht gefuntz. Ich probiere es mal mit '\n'.....
Danke für eure Hilfe.
 
Ja foobar(x) soll nur darstellen das du etwas tust :jaja:

wir wissen ja nicht wie deine funktion aussieht ;)

gruß
Allan
 
Ok..... Jetzt bin ich schon einen Schritt weiter. Das mit dem '\n' funktioniert...... Nun hab ich ein weiteres Problem....
PHP:
while(X=getc(stdin)!='\n'){
if(i=0){	if(X>='a' && X<='z'){printf("ja");}
			else printf("NO");
		}
else	if((X>='a' && X<='z')|| X>=0 && X<=9)){printf("ja");}
		else printf("NO");
	}

Das "Interval" von klein a bis klein z wird nicht richtig abgefragt. Er erkennt nicht dass ich das Interval meine. Ich DARF hier nicht mir den ASCII Nummern arbeiten, weil ich nicht sicher Stellen kann, dass ASCII verwendet wird. Ich muss also wirklich auf Buchstaben testen. Und eine Switchanweisung mit 26 Einträgen zu machen ist mir zu blöd.

Der Code ist nur ein Auszug. Das i wäre ein Zähler mit dem ich später prüfe ob die Zeichenkette die richtige Länge hat und ob das erste Zeichen ein Kleinbuchstabe ist...
 
Du solltest dir unbedingt Gedanken machen, wie du deinen Code anständig anzeigst.

Ich habe mal deinen Code genommen und ihn sauber dargestellt. Ich habe NUR Tabulatoren, Abstände und Umbrüche verändert. Das heisst dieser Code den hier dargestellt ist, ist genau der gleiche:
Code:
while(X=getc(stdin)!='\n'){
	if(i=0){
		if(X>='a' && X<='z'){printf("ja");}
                else printf("NO");
        }
	else if(X>='a' && X<='z'){printf("ja");}
	else printf("NO");
}
Willst du wirklich das?
Das ist im übrigen gleich bedeutend zu
Code:
while(X=getc(stdin)!='\n'){
	if(X>='a' && X<='z'){printf("ja");}
	else printf("NO");
}
 
Zuletzt bearbeitet:
Ich hab es etwas abgeändert.... schau noch mal nach oben Marduk...

Ich verstehe nicht ganz, warum das Intervall von a-z nicht richtig erkannt wird.
 
Die if abfrage ist richtig. Nur steht halt in X nicht ein charakter zwischen a-z. (Kannst ja mal Testen in dem du einen anderen Char Y auf einen Wert wie 'a' setzt und dann die if-abfrage machen).
Geh mal einbisschen Googlen und Tutorials suchen wie man in C richtig von stdin liest. So kann das nicht recht gehen.
 
Folgendes Mini-Programm funktioniert bei mir wie du es wünschst. Ich hab da nicht gross etwas geändert...

Code:
#include <stdio.h>

int main()
{

    char X;
    int i = 0;
    while(X=getc(stdin)!='\n') {

        if(i=0) {
            if(X>='a' && X<='z') {
                printf("ja");
            }
            else 
                printf("NO");
        }
        else if((X>='a' && X<='z') || (X>=0 && X<=9)) {
            printf("ja");
        }
        else
            printf("NO");
    }
}



Die if abfrage ist richtig. Nur steht halt in X nicht ein charakter zwischen a-z. (Kannst ja mal Testen in dem du einen anderen Char Y auf einen Wert wie 'a' setzt und dann die if-abfrage machen).
Geh mal einbisschen Googlen und Tutorials suchen wie man in C richtig von stdin liest. So kann das nicht recht gehen.
 
Ich bin ja kein profi in sowas, aber aus welchem grund definiert man i in jedem schleifendurchlauf auf 0, und warum macht man das in einer if-abfrage......und noch absurder für mich, warum hat die if-abfrage einen else-part, oder vergisst mein browser nur das zweite = von == anzuzeigen?
 
ja das mutet etwas absurd an!
Da die Zuweisung immer klappt, wird also auch immer nur der erste Teil ausgeführt. Ich vermute ein Vergleich (i==0) war gemeint, aber auch der gibt keinen Sinn, denn i wird innerhalb der Schleife nie verwendet!
 
Das "Interval" von klein a bis klein z wird nicht richtig abgefragt. Er erkennt nicht dass ich das Interval meine. Ich DARF hier nicht mir den ASCII Nummern arbeiten, weil ich nicht sicher Stellen kann, dass ASCII verwendet wird. Ich muss also wirklich auf Buchstaben testen. Und eine Switchanweisung mit 26 Einträgen zu machen ist mir zu blöd.

Die Vorlesungen zu Ansi C sind zwar schon ein paar Jahre her, aber ich glaube mich zu erinnern, dass deine Abfrage eben doch mit den ASCII Codes vergleicht. Wenn du mit reinem Ansi C arbeitest spricht eigentlich auch nichts gegen die Verwendung der ASCII Codes. Die ersten 255 Zeichen, haben (auch) heute in der Regel die selben Codes wie in der 7bit Asciitabelle.
 
Hallo,

eine kurze Anmerkung noch von mir zu dem Thema. Wenn du eine Abfrage mit (X >= 'A' && X <= 'Z') verwendest, setzt du implizit voraus, dass in dem vorliegenden Zeichensatz die Buchstaben A-Z hintereinander definiert sind. Also bist du schon fast beim ASCII-Code. :D

Bei EBDIC z.B. liegt A-Z NICHT zusammenhängend vor.

Was ich damit sagen will ist, dass du entwender gar keine Annahme bzgl. des verwendetens Codes machen darfst, dann kommst du wohl um einen Switch nicht herum, oder du machst sehr wohl Annahmen, und dann könntest du auch gleich die Codes verwenden, wenn dir die Buchstaben nicht zusagen.

Wobei der Code sicherlich besser zu lesen ist, wenn dort 'A' steht anstatt 65.

Gruß
Dirk
 
Zur Lösung des Problems selbst... Wie weit gehen die Kenntnisse in der Aussagenlogik (Speziell die Shannon-Zerlegung)?
 
Zuletzt bearbeitet:
Zurück
Oben Unten