реклама на сайте
подробности

 
 
> Как из текстовой строки вытащить подстроку, после определенного шаблона?
Димон Безпарольн...
сообщение Sep 7 2017, 14:06
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Есть допустим строка:

Код
unsigned char HTTPStr[] = "setting.html?SSID=sd&PASSWORD=dsd&NOTE=sds";



Нужно вытащить из нее sd и dsd.

Делаю так:

Код
int LeechPar(char* SrsBuf, char* Template, char* DestBuf)

{
    int T = strstr((const char*)SrsBuf, Template) + (strlen(Template));
    if(!T) {return 0;}
    int T1 = strstr((const char*)T,"&");
    if(!T1) {return 0;}
    int T2 = T1 - T;
        if(T2 > 20){return 0;}
    memcpy(DestBuf, T, T2);
    DestBuf[T2] = 0;
    return T2;
}

int main (void)
{    

    char Buf[20];

    //int T = strstr((const char*)HTTPStr,"SSID=") + 5;
    //int T1 = strstr((const char*)T,"&");
    //memcpy(Buf, T, T1 - T);
    //Buf[T1 - T] = 0;
    
    int P = LeechPar(HTTPStr, "SSID=", Buf);
    printf("\n%s %d\n", Buf, P);            

    P = LeechPar(HTTPStr, "PASSWORD=", Buf);
    printf("\n%s %d\n", Buf, P);    

}


Какие могут быть подводные камни? И может быть есть способ проще?

Сообщение отредактировал Димон Безпарольный - Sep 7 2017, 14:16
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Димон Безпарольн...
сообщение Sep 7 2017, 15:02
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Если так, то что - то не получается:

Код
    char ssid[20];
    char pass[20];    
    sscanf(HTTPStr, "setting.html?SSID=[^&]&PASSWORD=[^&]", ssid, pass);
    printf("\n%s\n", ssid);


Но идея хорошая. Это работает:

Код
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

char *tokenstring = "first,25.5,second,15";
int result, i;
double fp;
char o[10], f[10], s[10], t[10];

void main()
{
   result = sscanf(tokenstring, "%[^','],%[^','],%[^','],%s", o, s, t, f);
   fp = atof(s);
   i  = atoi(f);
   printf("%s\n %lf\n %s\n %d\n", o, fp, t, i);
}
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 7 2017, 15:09
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Димон Безпарольный @ Sep 7 2017, 18:02) *
Но идея хорошая.

Плохая: контроля переполнения нет, а чудес у вас и без того хватает, как можно было заметить.
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 7 2017, 16:07
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(aaarrr @ Sep 7 2017, 18:09) *
Плохая: контроля переполнения нет

Издеваетесь? У сканфа есть средства для этого. Лень в справочник заглянуть? Или вам надо предъявить все до последней запятой? Нет уж, увольте.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 7 2017, 16:34
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(scifi @ Sep 7 2017, 19:07) *
Издеваетесь? У сканфа есть средства для этого. Лень в справочник заглянуть? Или вам надо предъявить все до последней запятой? Нет уж, увольте.

Берегите нервы. Идея нормальная, реализация - увы.

Цитата(Димон Безпарольный @ Sep 7 2017, 18:41) *
Сломал голову, что такое с и чему оно равно в строке:

Код
    char *src = strstr((const char*)SrsBuf, Template), c;

Переменная типа char. Ничему не равна.

Цитата(Димон Безпарольный @ Sep 7 2017, 18:41) *
С исходной строкой:

Код
unsigned char HTTPStr[] = "setting.html?SSID=sd&PASSWORD=dsd&NOTE=sds";


Работает. А со строкой:
Код
unsigned char HTTPStr[] = "+IPD,0,471:GET /setting.html?SSID=5&PASSWORD=5 HTTP/1.1";


Уже нет.

Так определитесь с критериями определения конца поля.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Sep 7 2017, 16:48
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(aaarrr @ Sep 7 2017, 20:34) *
Так определитесь с критериями определения конца поля.

Конец поля увы оказался разный. Для этого и Template1
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 7 2017, 17:17
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Димон Безпарольный @ Sep 7 2017, 19:48) *
Конец поля увы оказался разный. Для этого и Template1

Подозреваю, что число вариантов все же конечное, и можно обойтись без Template1.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Sep 7 2017, 19:58
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(aaarrr @ Sep 7 2017, 21:17) *
Подозреваю, что число вариантов все же конечное, и можно обойтись без Template1.

Я пока и сам не знаю сколько их.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Димон Безпарольный   Как из текстовой строки вытащить подстроку   Sep 7 2017, 14:06
- - scifi   Кодsscanf(HTTPStr, "setting.html?SSID=...   Sep 7 2017, 14:21
|- - Димон Безпарольный   Цитата(aaarrr @ Sep 7 2017, 19:09) Плохая...   Sep 7 2017, 15:11
||- - aaarrr   Цитата(Димон Безпарольный @ Sep 7 2017, 18...   Sep 7 2017, 15:17
- - Димон Безпарольный   Некоторые убрал: Кодunsigned char HTTPStr[...   Sep 7 2017, 15:19
|- - aaarrr   Цитата(Димон Безпарольный @ Sep 7 2017, 18...   Sep 7 2017, 15:29
- - Димон Безпарольный   Сломал голову, что такое с и чему оно равно в стро...   Sep 7 2017, 15:41
- - timurey   Довольно простой парсер (взято отсюда: http://we.e...   Sep 8 2017, 07:25


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 20:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01443 секунд с 7
ELECTRONIX ©2004-2016