Stringek - bevezető

Karakterláncokról, szövegek és szövegdarabok feldolgozásáról lesz szó.

Karakter

Karakterlánc (string):

    Pl.  char s[100] = "hello!";

        'h'  'e'  'l'  'l'  'o'  '!'  '\0'
        104  101  108  108  111  33   0
        s[0] s[1] s[2] s[3] s[4] s[5] s[6]

Karakterkonstansok:

Szöveg-konstansok:

Példa

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <iostream>
using namespace std;

int main()
{
    char s[100] = "hello";

    cout << s << endl; // hello
    s[2] = 'x';
    cout << s << endl; // hexlo
    s[2] = '\0';
    cout << s << endl; // he

    return 0;
}

Stringek inicializálása:

    char s1[100] = "abc";
        s1[0] s1[1] s1[2] s1[3]     s[99]
        'a'   'b'   'c'   0     ... 0

    char s2[] = "abc";
        - ekkor s2 egy négyelemű tömb

        s2[0]  s2[1]  s2[2]  s2[3]
        'a'    'b'    'c'     '\0'

Kiírás:

    char s[100];
    // ...
    cout << s << endl; // kiírja a betűket az első '\0'-ig (azt már nem)

Beolvasás:

Egy szó beolvasása:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <iostream>
using namespace std;

int main()
{
    char s[100];

    cin >> s; // egy szót olvas a bemenetről
              // megáll az első fehér karakternél
              // (whitespace, pl. ' ', '\n', '\t')

    cout << s << endl;

    return 0;
}

Egész sor beolvasása:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;

int main()
{
    char s[100];

    cin.getline(s, 100);
        // - beolvas az első LF-ig (egy sort) és megáll 
        // (feltéve, hogy a sor nem hosszabb, mint 99 karakter)
        // - a bemenetről elfogyasztja a '\n'-t, de nem teszi bele s-be

    cout << s << endl;
    
    return 0;
}

Vagy:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <iostream>
using namespace std;

int main()
{
    char s[100];

    cin.get(s, 100);
        // hasonló a getline-hoz, azzal a különbséggel, 
        // hogy a '\n'-t a bemeneten hagyja

    cout << s << endl;
    
    return 0;
}

Mit írnak ki az alábbi programok (és miért), ha a bemenet:

    abc def
    123 456
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <iostream>
using namespace std;

int main()
{
    char s1[200], s2[200];

    cin.getline(s1, 200);
    cin.getline(s2, 200);

    cout << s1 << endl << s2 << endl;

    return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <iostream>
using namespace std;

int main()
{
    char s1[200], s2[200];

    cin.get(s1, 200);
    cin.get(s2, 200);

    cout << s1 << endl << s2 << endl;

    return 0;
}

Megjegyzések: a második változat esetén s2 üres string lesz, mert az első get(...) által otthagyott újsor miatt a második get(...) rögtön leáll (nem is várja meg a program, hogy beírjuk a második sort). Ahhoz, hogy két sort olvasson, a két get(...) között el kell fogyasztani a bemenetről az újsor karaktert egy üres get() vagy ignore() hívással:

    cin.get(s1, 200);
    cin.ignore();
    // vagy: cin.get();
    cin.get(s2, 200);

Feladat

Olvassunk be egy n term számot. A következő sorról olvassunk be egy mondatot. Írjuk ki a mondatot n-szer!

Példa

        bemenet:
            5
            geza kek az eg

        kimenet:
            geza kek az eg
            geza kek az eg
            geza kek az eg
            geza kek az eg
            geza kek az eg
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;

int main()
{

    int n;
    cin >> n;

    char s[100];

    // cin.getline(s, 100); // \n elfogyasztasa
    // cin.get(); // \n elfogyasztasa
    cin.ignore(); // \n elfogyasztasa


    cin.getline(s, 100);

    for (int i = 1; i <= n; i++)
        cout << s << endl;


    return 0;
}

Feladat

Beolvasunk egy n természetes számot (n<=10), majd n darab sort (sor hossza <= 100). Írjuk ki a sorokat fordított sorrendben.

Példa

    bemenet:
        3
        abcd
        1234
        harmadik

    kimenet:
        harmadik
        1234
        abcd
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;

int main()
{
    char sorok[10][101];

    int n;
    cin >> n; // '\n'-t bennehagyja

    cin.ignore(); // '\n' eldobja

    for (int i = 0; i < n; i++)
        cin.getline(sorok[i], 101);

    cout << "--------------" << endl;
    
    for (int i = n-1; i >= 0; i--)
        cout << sorok[i] << endl;

    return 0;
}