mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik string /strcpy / strcmp


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja geht auch...soweit ich das rcihtig in Erinnerung habe

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

Aber ist funktioniert nicht...!

Autor: bastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
strcmp liefert bei Gleichheit eine Null zurück

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
if(!strcmp(buf1,buf2)) 
{
    //Code
}
else
{
    //Code
}
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.

Autor: ChrisV (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann schreib doch:
...
if(!strcmp(buf1,buf2))
...

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sekunde....wird sofort getestet !

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jou !!!
Danke @ ALL!!!
Es funktioniert.....!! Gruss Frank

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuche mal
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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).


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.