回答 受付中

文字列一致判定でset,resetを判別したい

  • すぐに回答を!
  • 質問No.9585811
  • 閲覧数63
  • ありがとう数0
  • 気になる数0
  • 回答数3

お礼率 79% (846/1067)

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件)

  • 回答No.3

ベストアンサー率 46% (545/1183)

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

ベストアンサー率 60% (884/1466)

[技術者向] コンピューター カテゴリマスター
strstrを使うのなら検索候補文字列は長さの長い方を優先比較するのが道理です。
  • 回答No.1

ベストアンサー率 66% (376/565)

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が見つかったときの処理;
}
として
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


OKWAVE若者応援スペシャル企画

ピックアップ

ページ先頭へ