Hallo Zusammen,
in einem ESP empfange ich per UDP Texte in folgenden Formaten:
controlword|no|text
controlword|no|
controlword|
Z. B. "name|1|hallo" oder "date|2|" oder "clear|"
Das char-array packetBuffer beinhaltet den gesamten Text.
Zum Teilen in die drei Teiltexte nutze ich strtok.
char* controlword = strtok(packetBuffer, "|");
char* number = strtok(NULL, "|");
char* text = strtok(NULL, "");
Leider prüft "strtok" nicht nur auf den Teiler, sondern auch auf \0.
So dass z. B. bei dem Text "name|1" (also ohne letzten Trennzeichen), auch als controlword "name" und als number "1" ausgelesen wird.
Um festzustellen ob und wo sich die Trenner befinden, such ich mir zuvor die Trenner im packetBuffer.
(natürlich vor dem strtok-Block, weil danach packetBuffer leer wäre)
int pos_sep_1 = 0;
int pos_sep_2 = 0;
bool last_char_is_sep = false;
const char* sep_1 = strchr(packetBuffer, '|');
pos_sep_1 = sep_1 - packetBuffer + 1;
if (pos_sep_1 > 0)
{
pos_sep_2 = strchr(sep_1 + 1, '|') - packetBuffer + 1;
last_char_is_sep = strlen(packetBuffer) == pos_sep_2;
}
Dementsprechend wird dann im Nachgang geprüft, ob die Trenner vorhanden waren.
Falls nicht, wird der Teiltext geleert
if (pos_sep_1 <= 0)
{
memset(controlword, NULL, sizeof(controlword)); //clear array
}
if (text == NULL)
{
if ((number != NULL) && !last_char_is_sep)
memset(number, NULL, sizeof(number)); //clear array
}
Das Ganze könnte "Trenner suchen", "Array leeren", etc. könnte ich mir sparen, würde strtok nur nach dem Trenner suchen.
Aber (leider wird auch ein "\0" wird zum Trennen verwendet.
(strtok ersetzt den Trenner gegen "\0", und gibt den Teil des Arrays bis zum "\0" aus und merkt sich den Pointer für spätere Aufrufe)
Gibt es eine Alternative zu strtok die NUR den Trenner nutzt und nicht auch noch "\0"?
viele Grüße