Probleme Vergleich char*
-
Moin,
ich versuche zwei array of char in einer if Abfrage zu vergleichen, leider vergeblich.
Varible1:
const char* subscribe_topic[] ={"/30/SensorID", "/30/AktorID" };
Variable2 wir der methode übergeben:
void broker_callback (char* topic, byte* payload, unsigned int length) { char value[10] = ""; for (int i = 0; i < length; i++) { value[i] = payload[i]; } for (int i = 0; i < (sizeof(subscribe_topic)/sizeof(int)); i++){ Serial.print("Topic = "); Serial.print(topic); Serial.println("*"); Serial.print("subscribe ="); Serial.print(subscribe_topic[i]); Serial.println("*"); if (topic == subscribe_topic[i]){ Serial.println("Treffer"); topic_action(i, topic, value); } } }
Hier noch das Printergebnis:
Topic = /30/AktorID* subscribe =/30/SensorID* Topic = /30/AktorID* subscribe =/30/AktorID*
demnach müsste der zweite Durchlauf doch ein TRUE in der IF-clauses geben?
Ist aber nicht so.Hängen da noch Sonderzeichen dran?
Danke für eure Unterstützung.
Pf@nne
-
Du hast die Zeiger verglichen, nicht worauf sie zeigen.
Wenn du nicht weißt, wie man in C mit Zeichenketten umgeht, dann nutz doch die C++-Zeichenketten. Mit std::string wäre das nicht passiert. Der verhält sich, wie man es intuitiv erwartet.
-
Ich habe vorher noch nichts mit C/C++ gemacht, daher tue ich mich ein wenig schwer.
std::string --> schaue ich mir an.
Wie wäre der Vergleich denn richtig?
Das könnte auch erklären warum sizeof=4 ist, obwohl der String länger ist?
-
Pf@nne schrieb:
Ich habe vorher noch nichts mit C/C++ gemacht, daher tue ich mich ein wenig schwer.
Eine erste wichtige Erkenntnis wäre, dass C und C++ zwei ganz unterschiedliche Sprachen sind.
Das ist übrigens auch eine gute Möglichkeit, schlechte Lehrbücher und Lehrer zu erkennen, wenn sie behaupten, "C/C++" zu lehren.
Wie wäre der Vergleich denn richtig?
Die fertige Funktion strcmp aus der C-Standardbibliothek benutzen. Oder von Hand jedes Zeichen einzeln vergleichen (nichts anderes macht strcmp). Bei std::string einfach ganz intuitiv mittels ==.
Das könnte auch erklären warum sizeof=4 ist, obwohl der String länger ist?
Korrekt. Wenn du auch nicht mit rohen C-Arrays umgehen kannst, wären auch hier die C++-Alternativen (std::array oder einer der vielen anderen Container, wie z.B. der sehr nützliche std::vector) besser, denn die kennen ihre Größen selber und machen keine komischen Umwandlungen durch, wenn man sie an Funktionen übergibt.
-
Ich hab es jetzt mit strcmp gelöst.
if (strcmp(topic, subscribe_topic[i]) == 0){
Ich bin mir nicht sicher ob ich den vollen c++ Umfang zu Verfügung habe,
da ich mt der Arduino-Umgebung für µC arbeite.Ich komme da schritweise hinter, solange mir so nette Leute wie du helfen!!
Danke für deine Mühe!
Schönen Freirag Abend.