PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : "Problem" mit memcmp()



cyber_gh0st
08.09.2009, 16:35
Hi community

ich habe grade memcmp() ausprobiert:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
char a[30];
char b[30];
int i = 30;
int y;

printf("Gib ein Wort ein:");
fgets(a,30,stdin);
printf("Gib ein anderes Wort ein:");
fgets(b,30,stdin);

printf("DANKE für die eingabe\n");
y = memcmp(a, b, i);
if( y == 0 ) {
printf("Oh mein Gott nicht grade fantasievoll deine Eingabe...\n");
}

exit(EXIT_SUCCESS);
}


dabei ist dann das herumgekommen:

gh0st@a450-netbook:~$ cd Desktop
gh0st@a450-netbook:~/Desktop$ gcc test.c
gh0st@a450-netbook:~/Desktop$ ./a.out
Gib ein Wort ein:Hallo
Gib ein anderes Wort ein:Hallo
DANKE für die eingabe
gh0st@a450-netbook:~/Desktop$ ./a.out
Gib ein Wort ein:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAA
Gib ein anderes Wort ein:DANKE für die eingabe
gh0st@a450-netbook:~/Desktop$ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
bash: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: command not found
gh0st@a450-netbook:~/Desktop$ ./a.out
Gib ein Wort ein:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAA
Gib ein anderes Wort ein:DANKE für die eingabe
Oh mein Gott nicht grade fantasievoll deine Eingabe...
gh0st@a450-netbook:~/Desktop$
gh0st@a450-netbook:~/Desktop$





Warum kommt "oh mein Gott..." nicht wenn ich 2 mal Hallo eingebe???
und warum muss ich nicht 2 Eingaben machen wenn ich in die erste mehr als 30 Zeichen hereinpacke ich dacht mit fgets()
werden in meinem Fall nur 30 Zeichen eingelesen???

blackberry
08.09.2009, 16:42
fflush(stdin) vor dem zweiten fgets.

btw: memcpy gibt den ersten Parameter (Dateintyp: void *) zurück und keinen Integer!

EDIT: verlesen - unteren Teil nicht beachten (:

cyber_gh0st
08.09.2009, 16:50
ich mochte aber nicht Kopieren sondern vergleichen...

inout
08.09.2009, 17:06
Vergleiche doch nur die Anzahl der Bytes, die auch nötig sind; in den anderen kann sonst was drin' stehen.


i = strlen(a) >= strlen(b) ? strlen(a) : strlen(b);
y = memcmp(a, b, i);

blackberry
08.09.2009, 17:17
@cyber_ghost
Hab mich verguckt, sorry.

Das mit fflush() gillt trotzdem, um sicherzustellen, dass du zweimal einliest und nicht das, was beim ersten mal zuviel war.

Ansonsten gillt das, was inout gesagt hat.
Besser wäre jedoch strcmp zu benutzen, da dieses automatisch nach der 0-Terminierung ausschau hält und man sich damit die ganzen strlen-Aufrufe sparen kann.

Eine weitere Möglichkeit wäre "a" und "b" vorher mit memset auf 0 zu setzen, dann stellt man sicher, dass "in den anderen [...] sonst was drin' steh[t]" (um es mit den Worten von inout zu sagen ;))


mfG. BlackBerry

cyber_gh0st
08.09.2009, 17:20
das mit strcmp() weis ich ich wollte aber mal memcmp() ausprobieren.
vielen Dank für eure hilfe


EDIT:
So siehts jetz aus:

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

int main(void) {
char bla1[30];
char bla2[30];

memset(bla1, '\0', 30);
memset(bla2, '\0', 30);

fgets(bla1,30,stdin);
fflush(stdin);
fgets(bla2,30,stdin);
fflush(stdin);

if (memcmp(bla1,bla2,30) == 0) {
printf("=\n");
}
exit(EXIT_SUCCESS);
}