Получить первое слово после строки - PullRequest
0 голосов
/ 21 января 2019

Я использую esp8266, мне нужно взять первые кавычки работы после слова "+ CWLAP:"

Вот мой результат вывода.

AT+CWLAP
+CWLAP:(3,"MainNetwork",-76,"00:15:6d:a6:61:fa",1,107,0,5,3,3,0)
+CWLAP:(1,"SubNetwork",-79,"00:4f:62:19:19:43",9,85,0,0,0,3,0)

OK

Мне нужно распечатать основную сеть и подсеть. Вот что я пытаюсь сделать

char *p =strtok(Receive.bytes, "+CWLAP:"); 

p = strtok(NULL,  "\"");
p = strtok(NULL,  "\"");
printf("%s\r\n",p);
__delay_ms(20);

p = strtok(NULL,  "+CWLAP:");
p = strtok(NULL,  "\"");
p = strtok(NULL,  "\"");
printf("%s\r\n",p);
__delay_ms(20);

Для некоторого резонанса я принимаю это в свой вывод

MainNetwork
,1,107,0,5,3,3,0)
+CWLAP:(1,

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Поскольку strtok изменяет исходный массив, strcspn может использоваться для перебора массива вместе с strstr.
Поиск можно заключить в цикл, чтобы найти все совпадения.
strstr найдет точное совпадение подмассива в исходном массиве.
Начиная с совпадения, strcspn будет считать символы до следующего символа в источнике, который соответствует любому символу в строке разделителя.Здесь в качестве разделителя используется только цитата.Если strcspn не находит совпадения, оно считается до завершающего нуля.
Это печатает соответствующую строку, но strncpy может быть использовано для копирования строки.Обратите внимание на завершающий ноль.

#include <stdio.h>
#include <string.h>

int main()
{
    char bytes[] = "AT+CWLAP\n+CWLAP:(3,\"MainNetwork\",-76,\"00:15:6d:a6:61:fa\",1,107,0,5,3,3,0)\n+CWLAP:(1,\"SubNetwork\",-79,\"00:4f:62:19:19:43\",9,85,0,0,0,3,0)";
    char *quote = "\"";
    char *cwlap = "+CWLAP:";
    char *match = NULL;
    char *openquote = NULL;
    char *closequote = NULL;
    size_t skip = 0;
    size_t span = 0;

    closequote = bytes;
    while ( closequote && *closequote) {//not NULL and not zero terminator
        if ( ( match = strstr ( closequote, cwlap))) {//find exact sub-string match
            skip = strcspn ( match, quote);//count characters to quote
            openquote = match + skip;//point to quote
            if ( *openquote) {//not at terminating zero
                openquote++;//point to character after quote
                span = strcspn ( openquote, quote);//count characters to quote
                closequote = openquote + span;//point to quote
                if ( *closequote) {//not at terminating zero
                    printf ( "%.*s\n", (int)span, openquote);//print span number of characters
                    closequote++;//point to character after quote
                }
            }
            else {
                closequote = NULL;
            }
        }
        else {
            closequote = NULL;
        }
    }
    return 0;
}
0 голосов
/ 21 января 2019

заменить

char *p =strtok(Receive.bytes, "+CWLAP:");
p = strtok(NULL,  "\"");

от

char *p =strstr(Receive.bytes, "+CWLAP:"); 
p = strtok(p,  "\"");

потому что в вашем первом strtok "+ CWLAP:" это строка разделителей, поэтому strtok даст вам AT , помещенный перед '+'

аналогичен для второго, но strtok добавляет нулевые символы, поэтому второй strstr должен быть выполнен до любого strtok .

Полное решение может быть:

  char * p1 = strstr(Receive.bytes, "+CWLAP:"); 
  char * p3 = strstr(p1 + 7, "+CWLAP:"); 
  char * p2;

  p2 = strtok(p1,  "\"");
  p2 = strtok(NULL,  "\"");
  printf("%s\r\n",p2);

  p2 = strtok(p3,  "\"");
  p2 = strtok(NULL,  "\"");
  printf("%s\r\n",p2);

Дополнительное замечание, strtok изменить Receive.bytes, добавив нулевые символы. Может быть, вам сначала потребуется продублировать строку ( strdup )?

Исполнение:

MainNetwork
SubNetwork

И для управления любым количеством строк:

char * p1 = strstr(Receive.bytes, "+CWLAP:");

while (p1 != NULL) {
  p1 += 7; /* bypass +CWLAP: */

  char * p2 = strstr(p1, "+CWLAP:");
  char * s = strtok(strchr(p1, '"') + 1,  "\"");

  printf("%s\r\n", s);

  p1 = p2;
}

Я заменил первый strtok на strchr , потому что нам не нужна промежуточная строка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...