# PBinfo #2640 – ExtrageCuvant – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Cerința
Să se scrie o funcţie denumită extrageCuvant care să primească ca parametri trei şiruri de caractere în această ordine: destinatie, sursa, separatori şi un număr întreg prin intermediul căruia se va specifica numărul cuvântului ce se doreşte a fi preluat din şirul de caractere sursă şi pus în şirul destinaţie. 

În şirul separatori se vor găsi o serie de simboluri ce sunt utilizate pentru a despărţi cuvintele (de exemplu virgulă sau spaţiu, etc.). 

Dacă funcţia a copiat cu succes cuvântul căutat în şirul destinaţie, va returna valoarea 1. Altfel va returna valoarea 0 (de exemplu dacă textul conţine doar trei cuvinte şi se doreşte găsirea cuvântului al patrulea). 

Date de intrare
Funcţia va primi patru parametri în următoarea ordine: şirul destinaţie, şirul sursă, şirul conţinând lista simbolurilor considerate separatori de cunvinte şi poziţia cuvântului dorit, poziţie indexată de la 0 (primul cuvânt este cel de pe poziţia 0).

Date de ieșire
Funcţia va returna 1 dacă a reuşit să găsească un cuvânt pe poziţia căutată şi în şirul destinaţie va fi copiat acest cuvânt sau 0 în caz contrar.

Restricții și precizări
Nu se va folosi nici o funcţie de prelucrare a şirurilor de caractere (nu se va include cstring).

Exemplu:
Apelul: 

extrageCuvant(dest, "Un mar, doua mere, trei mere, toata livada !", ", !", 0);
va returna valoarea 1 şi va copia şirul Un în dest.

Apelul:

extrageCuvant(dest, "Un mar, doua mere, trei mere, toata livada !", ", !", 4);
va returna valoarea 1 şi va copia şirul trei în dest.

Apelul: 

extrageCuvant(dest, "Un mar, doua mere, trei mere, toata livada !", ", !", 8);
va returna valoarea 0, conţinutul variabilei dest nu va fi relevant în acest caz (nu va fi testat).

Explicație
Cuvintele din şirul Un mar, doua mere, trei mere, toata livada ! atunci când sunt despărţite de simbolurile virgulă, spaţiu şi semnul exclamării sunt acestea: Un, mar, doua, mere, trei, mere, toata, livada. Ele sunt pe poziţiile 0, 1, …, 7. Căutarea cuvântului de pe poziţia 0 va copia în destinaţie cuvântul Un şi funcţia va returna valoarea 1, în timp ce apelul pentru al optulea cuvânt va avea ca valoare rezultată 0.

## Cod sursă C++

```cpp
int cautaLitera(char s[], char c)
{
    for(int poz=0; s[poz]; poz++)
        if (s[poz]==c) return 1;
    return 0;
}
int extrageCuvant(char dest[], char sir[], char separatori[], int pozitie)
{
    int i=0;
    int contorCuvant=0;
    int k=0;
    int lung=0;
    while (sir[lung++]);
    while(sir[k] && contorCuvant < pozitie)
    {
        if (cautaLitera(separatori, sir[k])) while (cautaLitera(separatori, sir[k]) && sir[k]!=0) k++;
        while (!cautaLitera(separatori, sir[k]) && sir[k]!=0)k++;
        contorCuvant++;
    }
    if (k>lung) return 0;
    if (cautaLitera(separatori, sir[k])) while (cautaLitera(separatori, sir[k]) && sir[k]!=0) k++;
    if (k>lung) return 0;
    while (sir[k])
    {
        dest[i]=sir[k];
        i++;
        k++;
        if (cautaLitera(separatori, sir[k]) || k==lung) break;
    }
    dest[i]=0;
    if (dest[0]) return 1;
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/2640)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/2640/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-2640/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
