- 締切済み
文字列一致判定でset,resetを判別したい
AWS IoTのサーバを介して通信を行わせているのですが、”set”の文字列が”reset”という文字列の”set”部分で一致してtrueを出してしまうのですが、別の文字だと判別するためにはどの様にしたら良いでしょうか? (現在のコード) void mqttCallback (char* topic, byte* payload, unsigned int length) { Serial.print("Received. topic="); Serial.println(topic); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.print("\n"); char s2[] = "sec"; char s3[] = "set"; char s4[] = "reset"; char *ret; char *ret2; if ((ret = strstr((char *)payload, s2)) != NULL && (ret2 = strstr((char *)payload, s3)) != NULL ) { snprintf (msg, 75, "%sは%d番目にありました.\n", s2, ret - (char *)payload); Serial.println(msg); snprintf (msg, 75, "%sは%d番目にありました.\n", s3, ret2 - (char *)payload); Serial.println(msg); Serial.print("sec set \n"); digitalWrite(26, HIGH); Serial.println(msg); } else if ((ret = strstr((char *)payload, s2)) != NULL && (ret2 = strstr((char *)payload, s4)) != NULL ) { snprintf (msg, 75, "%sは%d番目にありました.\n", s2, ret - (char *)payload); Serial.println(msg); snprintf (msg, 75, "%sは%d番目にありました.\n", s3, ret2 - (char *)payload); Serial.println(msg); Serial.print("sec reset \n"); digitalWrite(26, LOW); Serial.println(msg); } else { snprintf (msg, 75, "%sはありませんでした.\n", s2); Serial.println(msg); } } ”msg”の文字列には sec set sec reset この2パターンのどちらかが来ます。 ただ、(ret2 = strstr((char *)payload, s4)) != NULL で”reset"を検出したいのですが、 re"set"部分を(ret2 = strstr((char *)payload, s3)) != NULL が検出してしまう様で、どちらもtrueのとして検出してしまいます。 どうぞ、ご教示の程よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
ズルいやり方だけど、前置空白コミの " set"/" reset" と比較するのはどうだろう。
- unokwave
- ベストアンサー率58% (966/1654)
strstrを使うのなら検索候補文字列は長さの長い方を優先比較するのが道理です。
- superside0
- ベストアンサー率64% (461/711)
if ( setが見つかったら ) { setが見つかったときの処理; } else if ( resetが見つかったら ) { resetが見つかったときの処理; } となっていると、"reset"が来たとき、"reset"のなかの"set"がヒットするので "reset"なのに、"set"がみつかったときの処理をしてしまうのが問題ってことですよね? それなら、if とelse ifの順番を逆にして 先にresetが見つかったときの処理を行って そうでないときの else if で setを探せばよいのでは。 つまり if ( resetが見つかったら ) { resetが見つかったときの処理; } else if ( setが見つかったら ) { setが見つかったときの処理; } として