Forum: Compiler & IDEs if abfragen von 2 Zeichen sorgt für Verwirrung.


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von DAVID B. (bastler-david)


Bewertung
-1 lesenswert
nicht lesenswert
Hallo
Ich Möchte einen String mit if auf Zeichen untersuchen.
Soll heißen im String steht zb A0 oder B1 C2 bla bla
Jetzt habe ich versucht dies so auszulesen:

Si = A0;
----------------------------
if (Si == 'A0')
{
--mache was
}

if (Si == 'B1')
{
--mache was anderes
}
----------------------------

Das Wird auch kompiliert (arduino IDE) ABER Es scheint IMMER True zu 
sein.
So Das A0 und B1 Immer Ausgeführt werden Welche sich Aber Gegenseitig 
Aufheben.

Wo wäre Mein Denkfehler Zusuchen ?
Vielen Dank

von STK500-Besitzer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Du vergleichst einen String mit einem Zeichen. Achte auf die 
Anführungszeichen auf der rechten Seite des Vergleichs

von Sven B. (scummos)


Bewertung
0 lesenswert
nicht lesenswert
das geht so nicht, du brauchst eine Funktion wie strcmp oder strncmp

von Tim T. (tim_taylor) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
DAVID -. schrieb:
> Wo wäre Mein Denkfehler Zusuchen ?
1. Strings werden mit doppelten Hochkommas eingeschlossen, nicht mit 
einfachen.
2. Strings werden mit strcpy(char *dest, char *src) zugewiesen.
3. Strings werden mit strcmp(char *str1, char *str2) verglichen.
4. Du verwendest Strings wo es anders einfacher geht.

> Vielen Dank
Bitte

von zitter_ned_aso (Gast)


Bewertung
0 lesenswert
nicht lesenswert
DAVID -. schrieb:
> 'A0'

ich kein Zeichen.

Also eher die Funktion strstr(...) zum Vergleichen nehmen.

von zitter_ned_aso (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Du kannst mit enum aussagekräftige Namen verwenden und trotzdem mit == 
vergeleichen. Vielleicht brauchst du die Strings gar nicht?
1
enum{A0, A1, A2} pin;
2
  
3
 pin =A0;
4
  
5
      switch(pin){
6
          case A0: puts("A0");
7
                   break;
8
          case A1: puts("A1");
9
                   break;
10
          case A2: puts("A3");
11
                   break;
12
          default: 
13
                   puts("Fehler");
14
     }

von DAVID B. (bastler-david)


Bewertung
0 lesenswert
nicht lesenswert
Nur der vollständigkeitshalber:
Es geht nur um EINEN String welcher sich natürlich Ändert.
Dieser kommt vom seriellen Port (Tut aber nix zur Sache).
Und muss nur mit 2 Zeichen abgeglichen werden.
Hat auch Gar nix mit Irgendwelchen A. Pins zu Tuhen.

Die Zeichen einzeln Auszuwerten hat sich Als zu Fehlerbehaftet erwiesen.

Danke Euch mal Sehen ob Ich Mit strcmp oder strncmp Weiter Komme.

von Klausi Häufchen-Einlauf (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Zwei poplige Zeichen könntest du natürlich auch mit zwei Vergleichen 
((a[0] == b[0]) && (a[1] == b[1])) abfertigen.

von Sven B. (scummos)


Bewertung
-4 lesenswert
nicht lesenswert
Klausi Häufchen-Einlauf schrieb:
> Zwei poplige Zeichen könntest du natürlich auch mit zwei Vergleichen
> ((a[0] == b[0]) && (a[1] == b[1])) abfertigen.

Naja, eher sowas wie

a[0] != 0 && a[1] != 0 && b[0] != 0 && b[1] != 0 && a[2] == 0 && b[2] == 
0 && a[0] == b[0] && a[1] == b[1]

Ist das jetzt toller als "!strcmp(a, b)"? Ich denke nicht ...

: Bearbeitet durch User
von PittyJ (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wird mal wieder Zeit für ein gutes C Buch.
Der Arduino ist von der Hardware einfach. Aber darauf läuft immer noch 
C++. Und das ist seit den 80er gleich kompliziert geblieben.

von Dirk B. (dirkb2)


Bewertung
0 lesenswert
nicht lesenswert
DAVID -. schrieb:
> Das Wird auch kompiliert (arduino IDE)

Dann schalte die Warnungen vom Compiler an.
Der sagt dir, dass er so ein Konstrukt merkwürdig findet.

Schalte ruhig alle Warnungen an und behebe die Ursache für die 
Warnungen.
(Behandele sie wie Fehler)

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
2 lesenswert
nicht lesenswert
Wenn die Arduino-Umgebung verwendet wird, kann natürlich die 
String-Klasse verwendet werden, und die wiederum hat den == -Operator 
entsprechend überladen.
1
String text;
2
3
text = "blabla";
4
5
if (text == "blabla")
6
{
7
  // etc.pp.
8
}

Der Code des Threadstarters muss also nur mit den korrekten 
Anführungzeichen geschrieben werden und funktioniert, sofern die 
Variable "Si" vom Typ String ist.

Ist "Si" allerdings ein char-Array, dann funktionieren die Vergleiche 
nicht.

https://www.arduino.cc/en/Tutorial/StringComparisonOperators

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]
  • [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.