Forum: Mikrocontroller und Digitale Elektronik string /strcpy / strcmp


von Frank (Gast)


Lesenswert?

Guten Morgen!
Ich habe ein Frage zu dem folgenden Quelltext, der lieder nicht so 
funktioniert wie ich mir das denke!


char buf1[8];
char buf2[8];

strcpy(buf2,"out");
strcpy(buf1,"out");

if(strcmp(buf1,buf2)) {
break; }

else {
printf(..) }

Warum springt dieser nicht in die if - Anweisung, sondern nach else...?
Ich möchte einfach die beiden buf1 und buf2 vergleichen!
Aber es funktioniert nicht..., sind diese gleiche möchte ich die break 
Anweisung ausführen!

von Steffen (Gast)


Lesenswert?

Musst du sie dann nicht auch über == vergleichen? So genau kenne mich 
nun auch wieder nicht aus aber so würde ich das machen.

von Frank (Gast)


Lesenswert?

ja geht auch...soweit ich das rcihtig in Erinnerung habe

if(strcmp(buf1,buf2)==1)

Aber ist funktioniert nicht...!

von bastian (Gast)


Lesenswert?

strcmp liefert bei Gleichheit eine Null zurück

von johnny.m (Gast)


Lesenswert?

strcmp gibt bei Gleichheit der verglichenen Strings eine "0" zurück und 
keine "1"! Wenn bei Gleichheit in den if-Zweig gesprungen werden soll, 
dann muss die Abfrage lauten
1
if(!strcmp(buf1,buf2)) 
2
{
3
    //Code
4
}
5
else
6
{
7
    //Code
8
}
Wenn der "Wert" des ersten Strings kleiner ist, als der des zweiten, 
dann wird eine negative Zahl zurückgegeben, wenn er größer ist, dann 
eine positive.

von ChrisV (Gast)


Lesenswert?

Dann schreib doch:
1
...
2
if(!strcmp(buf1,buf2))
3
...

von Frank (Gast)


Lesenswert?

Sekunde....wird sofort getestet !

von Steffen (Gast)


Lesenswert?

Schau dir das mal an:

void main(void)
{
  char *str1= "aaa", *str2= "bbb", *str3 = "ccc";
  int ptr;

  ptr = strcmp(str2, str1);
  if (ptr > 0)
   printf("String2 ist grösser als String1\n");
  else
   printf("String2 is kleiner als String1\n");

  ptr = strcmp(str2, str3);
  if (ptr > 0)
   printf("String2 ist grösser als String3\n");
  else
   printf("String2 ist kleiner als String3\n");
}

Da wird das Ergebnis des Vergleichs nochmal in ein Integer gesteckt!

von Frank (Gast)


Lesenswert?

Jou !!!
Danke @ ALL!!!
Es funktioniert.....!! Gruss Frank

von Frank (Gast)


Lesenswert?

Hallo !
Ich habe noch mal einen Nachtrag zu meinem eigentlich gelösten Problem !
Folgende Ausgangspunkt:

char buf1[8];
char buf2[8];

strcpy(buf1,"out");

printf("%s\n",buf2)

if(!strcmp(buf1,buf2)) {
break; }

else {
printf(..) }

Jetzt will (versuche) ich buf2 über den seriellen Port einzulesen!
Wird ein "out2 eingelesen, erfolgt die if Anweisung, falls nicht erfolgt 
die else Anweisung

Allerdings klappt das wiederum nicht...
Nun, zur Kontrolle habe ich mir den Wert des buf2 über nen 
printf-Befehl, vor der if-Schleife anzeigen lassen. Soweit sogut, das 
paßt auch!
Ich denke mal, dass durch das einlesen, Leerzeichen mit in den String 
kommen, die dann den Unterschied zu buf1 ausmachen.
Kann das sein ?? buf2[8]
Falls ja, gibt es eine Abhilfe dafür ??

Ich hoffe, mein Problem ist verständlich ;-)

von Werner B. (Gast)


Lesenswert?

Versuche mal
1
printf("!%s!\n",buf2);
dann siehts du was zwischen den !...! steht.
Ich tippe darauf dass das Einlesen Mist baut, zB keine 0 an das 
Textende.

Werner

von Karl H. (kbuchegg)


Lesenswert?

> Leerzeichen mit in den String
> kommen, die dann den Unterschied zu buf1 ausmachen

Das kann schon sein. Heisser Kandidat ist auch immer wieder
ein '\n' (also ein Zeilenvorschub) oder ein '\t' (also
ein Tabulator)

Auf die Spur kannst du dem Kommen, indem du dir mal
die Länge des Strings ausgeben lässt ( strlen() )

Was auch immer ein Augenöffner ist, ist die Testausgabe
etwas geschickter machen. Du machst
printf("%s\n",buf2)
Und nur mit extrem guten Augen kannst du sehen, ob da ein
Leerzeichen davor oder dahinter ist. Wenn du dir aber ein
Sonderzeichen davor und dahinter machst, dann siehst du
Leerzeichen:

printf("\"%s\"\n",buf2)

jetzt siehst du den Unterschied zwischen

  "out" und "out "
oder überhaupt: "out
"

(Falls es nicht klar ist: im letzen Beispiel ist ein Zeilen-
vorschub im String drin. Drum ist das abschliessende " auf einer
neuen Zeile).


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.