﻿/*
    Beépített függvények karakterek és karakterláncok feldolgozására

    1. #include <cctype>   // ctype.h
        - isalpha, isdigit, islower, isupper, isspace, isalnum
            (kapnak egy karaktert, visszatérítenek egy logikai értéket)
        - tolower, toupper
            (kapnak egy karaktert, és visszatérítik az ennek megfelelő kis-
             illetve nagybetűt - ennek a kódját)

    Pl.
*/
/*
#include <iostream>
#include <cctype>   // ctype.h
using namespace std;

int main()
{
    char karakterek[] = { ' ', 'a', 'z', 'S', '6', ',', '\n' };
    int n = 7;

    for (int i = 0; i < n; i++) {
        char c = karakterek[i];

        cout << "a karakter: '" << c << "'\n";

        char c2 = tolower(c);
        cout << "tolower: " << c2 << endl;
        cout << "toupper: " << (char) toupper(c) << endl;
        cout << endl;
        cout << "isdigit: " << isdigit(c) << endl;
        cout << "isalpha: " << isalpha(c) << endl;
        cout << "isalnum: " << isalnum(c) << endl;
        cout << "isupper: " << isupper(c) << endl;
        cout << "islower: " << islower(c) << endl;
        cout << "isspace: " << isspace(c) << endl;

        cout << "---------\n";
    }

    return 0;
}
*/



/*
    2. #include <cstring>  // string.h

    a) strlen - string hossza (ld. az általunk megírt hossz függvényt)

        int h = strlen("hello");
        cout << h << endl;

    String, mint memóriacím:
        - általában egy tömb tulajdonképpen egy memóriacím: az első elemének a
          címe;
        - ezeket a címeket összeadással el lehet tolni
        - a címek típusa ("pointer"): alaptípus * (pl. char *)

    Pl.
*/
/*
#include <cstring>
#include <iostream>
using namespace std;

int main()
{
    char str[100] = "teroretic";

    cout << str << " " << strlen(str) << endl;
    cout << str+3 << " " << strlen(str+3) << endl;

    return 0;
}
*/



/*  b) strcpy - karaktersorok másolása
            strcpy(cél, forrás)
    Pl.
*/
/*
#include <cstring>
#include <iostream>
using namespace std;

int main()
{
    char str[100] = "teszt";
    char str2[100];

    // str2 = str; // hiba!

    strcpy(str2, str);
    cout << str2 << endl;
    strcpy(str2, "szerda");
    cout << str2 << endl;

    return 0;
}
*/



/*  c) strcat - karaktersorok összefűzése
                (a "cat" a concatenate szóból származik)
        strcat(cél, forrás)


    Pl.
*/
/*
#include <cstring>
#include <iostream>
using namespace std;

int main()
{
    char str[100] = "teszt";
    char str2[100] = "abc";

    strcat(str2, str);
    cout << str2 << endl;
    strcat(str2, " szerda");
    cout << str2 << endl;

    return 0;
}
*/



/*  d) strcmp - karaktersorok összehasonlítása

    strcmp(egyik, masik)
        <0 ha "egyik" a szótárban hamarabb van, mint "masik"
        0  ha egyenlőek
        >0 ha "egyik" később van a szótárban, mint "masik"

    Pl.
*/
/*
#include <cstring>
#include <iostream>
using namespace std;

int main()
{
    char str1[100];
    char str2[100];

    cin.getline(str1, 100);
    cin.getline(str2, 100);

    int r = strcmp(str1, str2);

    if (r == 0)
        cout << "a ket karaktersor egyenlo\n";
    else if (r < 0)
        cout << "az elso van elobb\n";
    else // r > 0
        cout << "a masodik van elobb\n";

    return 0;
}
*/



/*  e) strchr - karakter keresése stringben

        strchr(str, 'a')
            - megadja az 'a' első előfordulásának a címét, vagy NULL-t ha 
              nincs benne
    Pl.
*/
/*
#include <cstring>
#include <iostream>
using namespace std;

int main()
{
    char str[100];
    cin.getline(str, 100);

    if (strchr(str, 'e') != NULL)
        cout << "van benne e\n";
    else
        cout << "nincs benne e\n";

    return 0;
}
*/

// Alkalmazás: döntsük el, hogy egy betű magánhangzó-e.
/*
#include <cstring>
#include <cctype>
#include <iostream>
using namespace std;

int main()
{
    char c;
    cin >> c;

    if (strchr("aeiouAEIOU", c) != NULL)
        cout << "maganhangzo\n";
    //else
    //    cout << "nem meganhangzo\n";
    else if (isalpha(c))
        cout << "massalhangzo\n";
    else
        cout << "nem betu";

    return 0;
}
*/


//  f) strrchr - karakter keresése stringben
/*
        strchr(str, 'a')
            - megadja az 'a' utolsó előfordulásának
            a címét, vagy NULL-t ha nincs benne
*/



/*  g) strstr - string keresése stringben
        strstr(str1, str2)
            - megadja az str2 első előfordulásának a címét str-ben,
              vagy NULL-t ha nincs benne
    Pl.
*/
/*
#include <cstring>
#include <iostream>
using namespace std;

int main()
{
    char str1[100], str2[100];
    cin.getline(str1, 100);
    cin.getline(str2, 100);

    if (strstr(str1,str2) != NULL)
        cout << str2 << " megvan a masikban\n";
    else
        cout << str2 << " nincs meg benne\n";

    return 0;
}
*/
/*
#include <cstring>
#include <iostream>
using namespace std;

int main()
{
    char str1[100], str2[100];
    cin.getline(str1, 100);
    cin.getline(str2, 100);

    char *p = strstr(str1,str2);

    if (p == NULL)
        cout << str2 << " nincs meg benne\n";
    else {
        int poz = p - str1;
        cout << "megvan a(z) " << poz
             << " indextol kezdodoen\n";
    }

    return 0;
}
*/



/* h) strncpy(cél, forrás, n)
    - másol n karaktert forrásból célba
    - ha rövidebb, akkor kitölt nullákkal
    - ha hosszabb, akkor megáll n karakter után, de nem tesz '\0'-t a cél végére
*/
// Feladat: 2020, testul 8
/*
    strcpy(s,"stilou"+4);
    cout<<s<<endl;
    strncpy(s,"stilou",4); s[4]='\0';
    for(i=0;i<4;i++)
        if(i%2==0) s[i]=s[0]+i-1;
        else s[i]=s[0]+3*(2*i/3-1);
    cout<<s;
*/

/* i) strncat(cél, forrás, n)
    - cél-hoz hozzáragaszt n karaktert a forrásból és lezárja '\0'-lal
    - ha a forrás n-nél rövidebb, akkor az egész hozzá lesz ragasztva 
      (mint strcat-nél)
*/
/*
#include <cstring>
#include <iostream>
using namespace std;

int main()
{
    char str1[100] = "alma";
    char str2[100] = "korte";

    //strncat(str1, str2, 2);
    //cout << str1 << endl;  // almako

    strncat(str1, str2, 20);
    cout << str1 << endl;

    return 0;
}
*/

/* j) strncmp(str1, str2, n)
   - olyan, mint az strcmp, de csak az első num darab karaktert nézi
*/
// Pl. előtag vizsgálata
#include <cstring>
#include <iostream>
using namespace std;

int main()
{
    char str1[100];
    char str2[100];
    cin.getline(str1, 100);
    cin.getline(str2, 100);

    // előtagja-e str2 az str1-nek?

    int n2 = strlen(str2);
    if (strncmp(str1,str2,n2) == 0)
        cout << "elotagja" << endl;
    else
        cout << "nem elotagja" << endl;

    /* VAGY:
    if (strstr(str1, str2) == str1)
        cout << "elotagja" << endl;
    else
        cout << "nem elotagja" << endl;
    */

    return 0;
}

/* 
    Egyéb függvények + dokumentáció az eddigiekhez:
    https://cplusplus.com/reference/cstring/
*/

