Problem mit Escape-Sequncen in C - Help!

Diskutiere das Thema Problem mit Escape-Sequncen in C - Help! im Forum Mac OS Entwickler, Programmierer.

  1. Thomas_xp

    Thomas_xp Thread Starter Mitglied

    Beiträge:
    632
    Zustimmungen:
    12
    Mitglied seit:
    05.04.2006
    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.
     
  2. Deever

    Deever Mitglied

    Beiträge:
    35
    Zustimmungen:
    2
    Mitglied seit:
    19.07.2007
    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
     
  3. allan

    allan Mitglied

    Beiträge:
    273
    Zustimmungen:
    14
    Mitglied seit:
    07.02.2008
    CR = carriage return = Naechste Zeile ;)
     
  4. Deever

    Deever Mitglied

    Beiträge:
    35
    Zustimmungen:
    2
    Mitglied seit:
    19.07.2007
    Aha. Und funktionierts jetzt? ;)

    Gruß,
    /dev
     
  5. Thomas_xp

    Thomas_xp Thread Starter Mitglied

    Beiträge:
    632
    Zustimmungen:
    12
    Mitglied seit:
    05.04.2006
    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.
     
  6. allan

    allan Mitglied

    Beiträge:
    273
    Zustimmungen:
    14
    Mitglied seit:
    07.02.2008
    Ja foobar(x) soll nur darstellen das du etwas tust :jaja:

    wir wissen ja nicht wie deine funktion aussieht ;)

    gruß
    Allan
     
  7. Thomas_xp

    Thomas_xp Thread Starter Mitglied

    Beiträge:
    632
    Zustimmungen:
    12
    Mitglied seit:
    05.04.2006
    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>=&& 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...
     
  8. Marduk

    Marduk Mitglied

    Beiträge:
    499
    Zustimmungen:
    34
    Mitglied seit:
    13.10.2003
    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");
    }
     
  9. Thomas_xp

    Thomas_xp Thread Starter Mitglied

    Beiträge:
    632
    Zustimmungen:
    12
    Mitglied seit:
    05.04.2006
    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.
     
  10. Marduk

    Marduk Mitglied

    Beiträge:
    499
    Zustimmungen:
    34
    Mitglied seit:
    13.10.2003
    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.
     
  11. _ebm_

    _ebm_ Mitglied

    Beiträge:
    2.079
    Zustimmungen:
    202
    Mitglied seit:
    19.01.2008
    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");
        }
    } 


     
  12. Floor

    Floor Mitglied

    Beiträge:
    30
    Zustimmungen:
    0
    Mitglied seit:
    11.11.2007
    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?
     
  13. wegus

    wegus Mitglied

    Beiträge:
    16.282
    Zustimmungen:
    2.901
    Mitglied seit:
    13.09.2004
    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!
     
  14. El Jarczo

    El Jarczo Mitglied

    Beiträge:
    558
    Zustimmungen:
    9
    Mitglied seit:
    07.07.2004
    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.
     
  15. just.do.it

    just.do.it Mitglied

    Beiträge:
    756
    Zustimmungen:
    72
    Mitglied seit:
    13.08.2007
    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
     
  16. _ebm_

    _ebm_ Mitglied

    Beiträge:
    2.079
    Zustimmungen:
    202
    Mitglied seit:
    19.01.2008
    Zur Lösung des Problems selbst... Wie weit gehen die Kenntnisse in der Aussagenlogik (Speziell die Shannon-Zerlegung)?
     
Die Seite wird geladen...

MacUser.de weiterempfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Akzeptieren Weitere Informationen...