[HILFE]: If-Schleife wird einfach übersprungen

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: [HILFE]: If-Schleife wird einfach übersprungen

Beitrag von Dirty Oerti » Fr Mär 18, 2011 7:40 pm

Ich erinnere noch mal daran: Leute, rückt euren Code anständig ein!
canlot hat geschrieben:Funktioniert bei mir wenn ich denn Tastaturpuffer leere.
Das Problem ist, dass das "Leeren des Eingabepuffers" eigentlich gar nicht als Operation im C Standard vorgesehen ist:

http://faq.cprogramming.com/cgi-bin/sma ... 1043284351
(Das sollten wir bei uns auch mal erwähnen .. oder tun wir das schon? ^^)

Sprich, fflush(stdin) ist streng genommen falsch. Abhängig von der Implementierung von fflush funktioniert es aber trotzdem, oder es tut z.B. einfach nichts.
nouseforname hat geschrieben:Ich finde es aber nicht schlimm so anzufangen und irgendwann selbst zu merken dass es auch besser geht.
Da ist was dran. Nur darin verbeißen sollte man sich halt nicht.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: [HILFE]: If-Schleife wird einfach übersprungen

Beitrag von canlot » Fr Mär 18, 2011 7:51 pm

Dirty Oerti hat geschrieben:Ich erinnere noch mal daran: Leute, rückt euren Code anständig ein!
Ist ja nicht mein Code, ich habe denn nur umgeändert.
Man kann ja fgets benutzen, da habe ich allerdings einen Fehler bei vergleichen von Strings.
Unwissenheit ist ein Segen

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: [HILFE]: If-Schleife wird einfach übersprungen

Beitrag von Dirty Oerti » Fr Mär 18, 2011 8:12 pm

Wie vergleichst du die Strings?
Mit strcmp, ansonsten läuft's nicht (außer du hast dir selbst was geschrieben, was ne nette kleine Übung ist)
:)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: [HILFE]: If-Schleife wird einfach übersprungen

Beitrag von canlot » Fr Mär 18, 2011 8:30 pm

Jo mit strcmp.

Code: Alles auswählen

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

    int main(void)
    {
        char hallo[10] = "lol";
        char eingabe[10] = "";
        fgets(eingabe,10,stdin);

        //scanf("%s",eingabe);
            if(strcmp(hallo,eingabe)==0)
            {

                printf("Strings gleich\n");

            }
            
        printf("%s",eingabe);
        return 0;
    }
Versuch mal mit fgets und mit scanf. :D
Unwissenheit ist ein Segen

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: [HILFE]: If-Schleife wird einfach übersprungen

Beitrag von Dirty Oerti » Fr Mär 18, 2011 11:18 pm

Erstens:
Dirty Oerti hat geschrieben:Ich erinnere noch mal daran: Leute, rückt euren Code anständig ein!
canlot hat geschrieben:Ist ja nicht mein Code, ich habe denn nur umgeändert.
Jetzt ist es aber dein Code.
Rück anständig ein, sonst verlierst du früher oder später den Überblick, ganz zu schweigen davon, was andere sagen, die mit dir zusammenarbeiten sollen/wollen/müssen/dürfen!

Dann:
Das du dir die Eingabe mal ausgeben lässt zeigt dir doch eigentlich schon, wo dein Fehler liegt:

Code: Alles auswählen

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

int main (int argc, char** argv)
{
    const char text[] = "lol";
    char eingabe[10];
    
    //fgets(eingabe,10,stdin);
    scanf("%s",eingabe);
    
    if (strcmp(text, eingabe) == 0)
    {
        printf("Strings sind gleich\n");
    }
    else
    {
        printf("Strings sind nicht gleich\n");
    }
    
    printf("eingabe: %s\n",eingabe);
    
    return 0;
}

(Außer der Einrückung solltest du auch darauf achten, dass deine Variablen einigermaßen sinnvolle Namen haben, und die main Funktion sollte so aussehen wie hier und nicht anders (wie du argv schreibst ist dabei aber fast egal, Hauptsache es ist erkenntlich, dass es ein Array von Char-Arrays ist)

Die Ausgabe:
mit fgets hat geschrieben: daniel@gosigmus:~$ ./pc
lol
Strings sind nicht gleich
eingabe: lol

daniel@gosigmus:~$
mit scanf hat geschrieben: daniel@gosigmus:~$ ./pc
lol
Strings sind gleich
eingabe: lol
daniel@gosigmus:~$
Siehst du den Unterschied? :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: [HILFE]: If-Schleife wird einfach übersprungen

Beitrag von Dirty Oerti » Fr Mär 18, 2011 11:56 pm

Code: Alles auswählen

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


char* read_input (char* buffer, unsigned int size)
{
    char* ret = NULL;
    if (size > 0 && buffer != NULL)
    {
        ret = fgets(buffer,size,stdin);
        if (ret != NULL)
        {
            unsigned int len = strlen(buffer);
            if (len < size)
            {
                buffer[len-1] = '\0';
            }
        }
    }
    return ret;
}

char* get_input (unsigned int size)
{
    char* ret = NULL;
    if (size > 0)
    {
        char* buffer = (char*) malloc(sizeof(char)*size);
        ret = read_input(buffer,size);
        if (ret == NULL && buffer != NULL)
        {
            free(buffer);
        }
    }
    return ret;
}


int main (int argc, char** argv)
{
    const char text[] = "lol";
    
    /*
    fgets(eingabe,10,stdin);
    int len = strlen(eingabe);
    if (len < 9)
    {
        eingabe[len-1] = '\0';
    }
    */
    
    char eingabe[10];
    read_input(eingabe,10);
    
    // ########## 1 ######### char* eingabe = get_input(10);
    // ########## 1 ######### ACHTUNG: eingabe kann hier == null sein, das muss
    //                                 abgefangen werden!
    
    if (strcmp(text, eingabe) == 0)
    {
        printf("Strings sind gleich\n");
    }
    else
    {
        printf("Strings sind nicht gleich\n");
    }
    
    printf("eingabe: %s\n",eingabe);
    
    // ########## 1 ######### free(eingabe);
    return 0;
}

Ein paar Spielereien, die man damit jetzt anfangen kann, um sich selbst eine sichere Eingabe zu basteln.
Natürlich muss man sich noch um das Problem des Eingabepuffers kümmern!
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: [HILFE]: If-Schleife wird einfach übersprungen

Beitrag von canlot » Sa Mär 19, 2011 12:19 am

Dirty Oerti hat geschrieben:Siehst du den Unterschied? :)

So könnte funktionieren

Code: Alles auswählen

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

int main (int argc, char** argv)
{
    const char text[] = "lol";
    char eingabe[10];

    fgets(eingabe,10,stdin);
    //scanf("%s",eingabe);
    eingabe[strlen(eingabe) - 1] = '\0';

    if (strcmp(text, eingabe) == 0)
    {
        printf("Strings sind gleich\n");
    }
    else
    {
        printf("Strings sind nicht gleich\n");
    }

    printf("eingabe: %s\n",eingabe);

    return 0;
}
Was ich im Google gefunden habe:
Mit der fgets Funktion speichert es ein newline Zeichen in den String.
Wenn man denn letzten Zeichen abschneidet und dann statt newline stringende Zeichen setzt, dann gehts.
Unwissenheit ist ein Segen

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: [HILFE]: If-Schleife wird einfach übersprungen

Beitrag von Dirty Oerti » Sa Mär 19, 2011 12:35 pm

canlot hat geschrieben:
Dirty Oerti hat geschrieben:Siehst du den Unterschied? :)

(...)
Mit der fgets Funktion speichert es ein newline Zeichen in den String.
Wenn man denn letzten Zeichen abschneidet und dann statt newline stringende Zeichen setzt, dann gehts.
Na also, da ist er doch, der Unterschied.
Wenn du dir die beiden Ausgaben, die ich gepostet habe anguckst, wirst du feststellen, dass bei fgets bei der Ausgabe des eingegebenen Strings eine leere Zeile vorhanden ist!

Wenn du aber stumpfsinnig einfach nur das letzte Zeichen abschneidest, dann funktioniert das nicht.
Gibt doch mal folgendes ein:
1234567890
Und lass von fgets 10 Zeichen einlesen.

Deswegen hatte ich oben eigentlich auch gepostet, wie es funktioniert :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Antworten