みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

文字列一致判定で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のとして検出してしまいます。

どうぞ、ご教示の程よろしくお願い致します。

投稿日時 - 2019-02-08 14:58:54

QNo.9585811

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

ズルいやり方だけど、前置空白コミの " set"/" reset" と比較するのはどうだろう。

投稿日時 - 2019-02-10 16:55:23

ANo.2

strstrを使うのなら検索候補文字列は長さの長い方を優先比較するのが道理です。

投稿日時 - 2019-02-08 22:31:52

ANo.1

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が見つかったときの処理;
}
として

投稿日時 - 2019-02-08 17:51:56

あなたにオススメの質問