PDA

Просмотр полной версии : [Вопрос] Найти и извлечь..



StevenH
21.07.2017, 19:04
Есть следующий текст в диалоге (приходит с HTTP после регистрации аккаунта на форуме).
http://i.imgur.com/0XUHZj8.png

Нужно как то вытянуть от сюда поле где написано: Номер аккаунта: 18 (вытянуть нужно только само число и представить его в виде целочисленного числа, чтобы сохранить в обычную int переменную).

Мне это нужно, чтобы id аккаунта сохранить в аккаунт игрока, а при необходимости по номеру аккаунта с форуму, обращаться к API, например получать статистику с форумного аккаунта и прочее.

StevenH
22.07.2017, 13:50
Подниму пожалуй спустя 16 часов

Up..

DeimoS
22.07.2017, 14:16
Эхх, велосипеды... Обожаю.


Как я уже писал в соседней теме, можно при помощи strfind. Вот готовая схема

new string[] = "Регистрация форумного аккаунта завершена!\n\nНомер аккаунта:\t\t18\nИмя аккаунта:\t\tDeimoS",// Массив с текстом диалога
pos1,
pos2,
buff[11];

static const find_string[] = "Номер аккаунта:\t\t";// А тут тот участок текста, который стоит перед ID аккаунта
pos1 = strfind(string, find_string, false, 0) + (sizeof(find_string)-1);// Собственно, сам поиск.
pos2 = strfind(string, "\n", false, pos1);
strmid(buff, string, pos1, pos2, 11);
printf("|%s| %d", buff, strval(buff));// Результат в массиве buff, который можно как строкой отобразить, так и числом при помощи strval

Принцип тут такой:

pos1 = strfind(string, find_string, false, 0) + (sizeof(find_string)-1);
В этой строке strfind находит начало фразы "Номер аккаунта:\t\t" (то бишь, расположение первой буквы в массиве string). Далее мы прибавляем к полученной координате размер самой строки "Номер аккаунта:\t\t", дабы добраться до начала нашего ID (так как работаем с sizeof, которая возвращает не максимальный порядковый номер массива (от 0 до ...), а именно количество ячеек (0+1+2+3+4 = 5 ячеек), то для того, чтоб вернуть именно размер строки, отнимаем единицу). Собственно, в pos1 у нас есть координата начала ID.
Сама строка для поиска определяется легко: берём всё то, что нам известно о тексте до искомого нами участка (точнее, то, что позволит нам сделать искомый текст максимально уникальным (именно поэтому там не просто взяло слово "аккаунта" или символ "\t") и уже по нему ищем). Если такого текста нет (так, на будущее), проявляем смекалку и при форматировании этот текст добавляем (например, можно было выделить ID аккаунта вот такими скобками: «» - которые нужно исключить из остального текста (дабы они были уникальны) и уже по ним найти начало и конец).

А уже вот тут:

pos2 = strfind(string, "\n", false, pos1);
мы ищем конец нашего ID, который записан в виде текста. В данном случае сразу после ID идёт символ переноса строки, который мы и ищем. Если был бы другой какой-то текст, известный нам заранее - искали бы его.

Ну и тут уже вычленяем наш ID в отдельный массив, опираясь на полученные координаты:

strmid(buff, string, pos1, pos2, 11);

Всё