Jump to content

[C++] Cum sa citesti parametrii dintr-un string conform unei sintaxe


MAMRETRAS
 Share

Recommended Posts

Hello! Pentru cei ce vor sa faca un mod in SFPlugin, acest tutorial explica cum puteti sa folositi parametrul string al unei functii pentru o comanda ca un stream de input:

 

#include <iostream>
#include <unordered_map>
#include <regex>
#include <sstream>
#include <string>

std::unordered_map<std::string, std::pair<std::regex, std::string>> syntaxes = {
    { "addTwoNumbers", { std::regex("[0-9]+\ [0-9]+"), "<number_1> <number_2>" } } // <- pentru functia "addTwoNumbers" avem sintaxa <number1> <number2> cu regex-ul respectiv
};

int add(int number1, int number2) {
    return number1 + number2;
}

void addTwoNumbers(std::string params) {
    std::regex syntax_regex = syntaxes[__FUNCTION__].first; // <- preluam regex-ul respectiv acestei functii
    if (std::regex_match(params, syntax_regex)) { // <- in caz ca parametrii se potrivesc
        std::stringstream ssin(params); // <- ne creem pe baza stringului un stream

        int number1, number2;
        ssin >> number1 >> number2; // <- si citim din stream ca si cum am citi de la tastarua
        std::cout << add(number1, number2) << "\n";
    }
    else {
        std::string syntax_text = syntaxes[__FUNCTION__].second; // <- preluam textul sintaxei corecte in caz ca apare o eroare
        std::cout << "ERROR! Syntax: " << syntax_text << "\n"; // <- si afisam sintaxa corecta
    }
}

int main() {
    std::string input;

    std::getline(std::cin, input);
    while (input != "exit") {
        addTwoNumbers(input);
        std::getline(std::cin, input);
    }

    return 0;
}

Consola:

 in: 2 4
out: 6
 in: 3 99123
out: 99126
 in: sal da
out: ERROR! Syntax: <number_1> <number_2>
 in: 1 da
out: ERROR! Syntax: <number_1> <number_2>
 in: 2
out: ERROR! Syntax: <number_1> <number_2>
 in: da 3
out: ERROR! Syntax: <number_1> <number_2>
 in: 3 5
out: 8

Pentru a adauga functii noi, tot ce trebuie sa faceti este sa adaugati in syntaxes urmatoarea structura:

{ nume_functie1, { regex1, sintaxa_corecta1 } },
{ nume_functie2, { regex2, sintaxa_corecta2 } }...

Regex-ul este preluat automat din syntaxes cu instructiunea:

void addTwoNumbers(std::string params) {
    std::regex syntax_regex = syntaxes[__FUNCTION__].first;

unde "__FUNCTION__" este numele functiei, adica "addTwoNumbers"!

Link to comment
Share on other sites

Putin cam greu de citit/inteles ce e aici, dar merge, e un tutorial fain dar nu e pt. incepatori. Felicitari Vescane!

On 2/13/2020 at 12:28 PM, Jackson Brooklyn said:

*Topicurile in care nu se posteaza pentru o perioada mai mare de 72 de ore vor fi inchise, fiind deschise ulterior la cerere (in caz ca doriti sa faceti un update) printr-un PM unui Programmer.

:topic_closed:

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.