Seite 1 von 1
String mit (fgets) und (strcmp)
Verfasst: Fr Jan 20, 2012 4:11 pm
von DANrulz81
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?
Re: String mit (fgets) und (strcmp)
Verfasst: Fr Jan 20, 2012 4:15 pm
von Xin
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.
Re: String mit (fgets) und (strcmp)
Verfasst: Fr Jan 20, 2012 4:29 pm
von DANrulz81
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;
}
Re: String mit (fgets) und (strcmp)
Verfasst: Fr Jan 20, 2012 4:50 pm
von Xin
Nehmen wir an, dass der String "\n" ist, dann ist
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.
Re: String mit (fgets) und (strcmp)
Verfasst: Fr Jan 20, 2012 4:59 pm
von DANrulz81
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.
Re: String mit (fgets) und (strcmp)
Verfasst: Fr Jan 20, 2012 5:07 pm
von Xin
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. ^^
Re: String mit (fgets) und (strcmp)
Verfasst: Fr Jan 20, 2012 5:25 pm
von DANrulz81
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
schon den ersten Buchstaben abgeschnitten hatte.