String mit (fgets) und (strcmp)

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
DANrulz81
Beiträge: 53
Registriert: Fr Dez 23, 2011 9:40 pm

String mit (fgets) und (strcmp)

Beitrag von DANrulz81 » Fr Jan 20, 2012 4:11 pm

Hallo zusammen,

ich wollte mal eine kleine Passwortabfrage mit Strings programmieren, dabei ist folgender Code entstanden:

Code: Alles auswählen

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

int main (void)
{
    char user[100], passwd[100];
    char admin[]="dennis", adminpw[]="einstein";

    printf("\nWillkommen bei danOS v0.1 alpha 1\n");
    printf("\nLogin:\n");
    printf("\nUser: \n");

    fgets(user,100,stdin);

    printf("\nPassword: \n");

    fgets(passwd,100,stdin);

    if((strcmp(user,admin)&&strcmp(passwd,adminpw))==0)
    {
        printf("\n%i",strcmp(user,admin));
        printf("\n%i",strcmp(passwd,adminpw));
        printf("\n\nSie sind als Admin angemeldet!!\n\n");
    }
    return 0;
}
Jetzt hab ich natürlich das Problem, dass mit (fgets) auch die "Eingabe"-Taste am Ende der Eingabe mitgelesen wird, weshalb mein (strcmp) eine 1 ausgibt, stimmt das?
Wie kann ich das umgehen?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: String mit (fgets) und (strcmp)

Beitrag von Xin » Fr Jan 20, 2012 4:15 pm

DANrulz81 hat geschrieben:ich wollte mal eine kleine Passwortabfrage mit Strings programmieren, dabei ist folgender Code entstanden [...]

Jetzt hab ich natürlich das Problem, dass mit (fgets) auch die "Eingabe"-Taste am Ende der Eingabe mitgelesen wird, weshalb mein (strcmp) eine 1 ausgibt, stimmt das?
Wie kann ich das umgehen?
Gar nicht, das Zeilenende-Zeichen wird bei den Standardfunktionen immer dabei bleiben.

Du kannst Dir mit strlen ausrechnen, wie lange der String überhaupt ist, und das New-Linezeichen ('\n'} (und eventuell das Carrier-Return-Zeichen ('\r') mit Null ('\0') überschreiben. Dann funktioniert auch strcmp.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

DANrulz81
Beiträge: 53
Registriert: Fr Dez 23, 2011 9:40 pm

Re: String mit (fgets) und (strcmp)

Beitrag von DANrulz81 » Fr Jan 20, 2012 4:29 pm

O.k. Ich hab das ganze versucht umzusetzen, allerdings klappt das nicht so ganz:

Code: Alles auswählen

#include <string.h>

int main (void)
{
    char user[100], passwd[100];
    int u_laenge, p_laenge, i;
    char admin[]="dennis", adminpw[]="einstein";

    printf("\nWillkommen bei danOS v0.1 alpha 1\n");
    printf("\nLogin:\n\n");
    printf("\nUser: \n");

    fgets(user,100,stdin);

    printf("\nPassword: \n");

    fgets(passwd,100,stdin);

    u_laenge=strlen(user);
    p_laenge=strlen(passwd);

    printf("\nuser: %i pw: %i\n",u_laenge,p_laenge);                    /*Zu Testzwecken*/

    user[u_laenge]='\0';
    passwd[p_laenge]='\0';

    if((strcmp(user,admin)&&strcmp(passwd,adminpw))==0)
    {
        printf("\n%i",strcmp(user,admin));
        printf("\n%i",strcmp(passwd,adminpw));
        printf("\n\nSie sind als Admin angemeldet!!\n\n");
    }
    return 0;
}

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: String mit (fgets) und (strcmp)

Beitrag von Xin » Fr Jan 20, 2012 4:50 pm

Nehmen wir an, dass der String "\n" ist, dann ist

Code: Alles auswählen

unsigned int length = strlen( "\n" );
Genau 1 Zeichen lang.

Wenn Du dann also auf das Zeichen [1] zugreifest, dann ist das ist das eben nicht das '\n', das an erster Stelle (nämlich [0]) steht, sondern die Null, die da sowieso schon ist.

Außerdem musst Du gucken, ob Du - je nach OS - nur ein '\n' oder auch ein '\r' am Ende des Strings hast.

Code: Alles auswählen

char user[] = "user\r\n";

if( user[0] ) // wurde was eingegeben?
{
  unsigned int length = strlen( user ) - 1;

  while( length && ( user[ length ] == '\n' || user[ length ] == '\r' )
    length--;

  user[ length ] = '\0';
}
Das kannst Du ja auch in eine Funktion packen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

DANrulz81
Beiträge: 53
Registriert: Fr Dez 23, 2011 9:40 pm

Re: String mit (fgets) und (strcmp)

Beitrag von DANrulz81 » Fr Jan 20, 2012 4:59 pm

Wenn ich das jetzt richtig verstanden habe, müsste es ja auch so gehen:

Code: Alles auswählen

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

int main (void)
{
    char user[100], passwd[100];
    int u_laenge, p_laenge, i;
    char admin[]="dennis", adminpw[]="einstein";

    printf("\nWillkommen bei danOS v0.1 alpha 1\n");
    printf("\nLogin:\n\n");
    printf("\nUser: \n");

    fgets(user,100,stdin);

    printf("\nPassword: \n");

    fgets(passwd,100,stdin);

    u_laenge=strlen(user);
    p_laenge=strlen(passwd);

    printf("\nuser: %i pw: %i\n",u_laenge,p_laenge);                   /*Zu Testzwecken*/

    user[u_laenge-1]='\0';
    passwd[p_laenge-1]='\0';

    if((strcmp(user,admin)&&strcmp(passwd,adminpw))==0)
    {
        printf("\n%i",strcmp(user,admin));
        printf("\n%i",strcmp(passwd,adminpw));
        printf("\n\nSie sind als Admin angemeldet!!\n\n");
    }
    return 0;
}
Wenn ich jetzt allerdings statt "dennis" zb. "steffi" eingebe, durchläuft er trotzdem die if-Bedingung.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: String mit (fgets) und (strcmp)

Beitrag von Xin » Fr Jan 20, 2012 5:07 pm

DANrulz81 hat geschrieben:Wenn ich das jetzt richtig verstanden habe, müsste es ja auch so gehen:

Wenn ich jetzt allerdings statt "dennis" zb. "steffi" eingebe, durchläuft er trotzdem die if-Bedingung.
Zum einen hatte ich eine while-Schleife, die sich auch um '\r' kümmert. Wenn '\r', dann zusammen mit '\n', nicht entweder oder.

Zweitens: Entsprechend der Bedingung sind neben steffi, auch torben, martin und gaby admins. Sogar Dennis. Der einzige, der definitiv kein Admin ist, ist dennis. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

DANrulz81
Beiträge: 53
Registriert: Fr Dez 23, 2011 9:40 pm

Re: String mit (fgets) und (strcmp)

Beitrag von DANrulz81 » Fr Jan 20, 2012 5:25 pm

O.k. Jetzt hab ich es begriffen, denke ich, denn so funktioniert es:

Code: Alles auswählen

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

int main (void)
{
    char user[100], passwd[100];
    int u_laenge, p_laenge, i;
    char admin[7]="dennis", adminpw[9]="einstein";

    printf("\nWillkommen bei danOS v0.1 alpha 1\n");
    printf("\nLogin:\n\n");
    printf("\nUser: \n");

    fgets(user,100,stdin);

    printf("\nPassword: \n");

    fgets(passwd,100,stdin);

    u_laenge=strlen(user);
    p_laenge=strlen(passwd);

    printf("\nuser: %i pw: %i\n",u_laenge,p_laenge);            /*Zu Testzwecken*/

    user[u_laenge-1]='\0';
    passwd[p_laenge-1]='\0';

    if(strcmp(user,admin)==0 && strcmp(passwd,adminpw)==0)
    {
        printf("\n%i",strcmp(user,admin));
        printf("\n%i",strcmp(passwd,adminpw));
        printf("\n\nSie sind als Admin angemeldet!!\n\n");
    }

    return 0;
}
Zum einen hatte ich eine while-Schleife, die sich auch um '\r' kümmert. Wenn '\r', dann zusammen mit '\n', nicht entweder oder.
Das mit dem '\r' konnte ich weglassen, da ich mit

Code: Alles auswählen

user[u_laenge-2]='\0';
    passwd[p_laenge-2]='\0';
schon den ersten Buchstaben abgeschnitten hatte.

Antworten