2014-09-07 4 views
0

Я написал небольшой интерфейс клиент-сервер, который использует простые текстовые строки, подобные MySQL, (зашифрованные) для связи между клиентом и сервером. Пример текстовой строки для входа пользователя в систему:Получить подстроку

SIGNIN WHERE USER="test" AND PASSWORD="1234" 

Я ищу, чтобы получить значения USER и PASSWORD для проверки с помощью локальной базы данных MySQL, но я озадачен на это, так как USER и PASSWORD поля в основном всегда разных размеров.

В Lua, это может быть возможно использовать что-то похожее на это, чтобы получить значение:

local username, password = 'SIGNIN WHERE USER="%s" AND PASSWORD="%s"'; 

Есть ли что-то подобное в C++, чтобы получить подстроки из строк подобным образом?

ответ

4

Что вы ищете sscanf

Хорошая документация и пример использования: http://en.cppreference.com/w/cpp/io/c/sscanf

Основная реализация для Вашего случая:

std::string exampleInput { "SIGNIN WHERE USER=\"foo\" AND PASSWORD=\"bar\" " }; 
    char username[64] {0}; 
    char password[64] {0}; 
    std::sscanf(exampleInput.c_str(), "SIGNIN WHERE USER=%63s AND PASSWORD=%63s", 
       username, password); 

редактировать: Как указано ниже, добавлены ограничения для длины строк с синтаксическим строком.

1

Вот один вариант, используя stringstream:

#include <iostream> 
#include <sstream> 
#include <string> 

using namespace std; 

int main(int argc, char** argv) { 
    string input = "SIGNIN WHERE USER=\"test\" AND PASSWORD=\"1234\""; 
    stringstream ss(input); 
    ss.ignore(numeric_limits<streamsize>::max(), '"'); 
    stringbuf username; 
    ss.get(username, '"'); 
    ss.ignore(1); 
    ss.ignore(numeric_limits<streamsize>::max(), '"'); 
    stringbuf password; 
    ss.get(password, '"'); 
    cout << "username: " << username.str() << endl 
     << "password: " << password.str() << endl; 
} 

Рабочий код здесь: http://codepad.org/B64WNz4O

Смежные вопросы