Karakterláncokról, szövegek és szövegdarabok feldolgozásáról lesz szó.
Karakter
- egy betűt vagy írásjelet reprezentáló érték
- C++-ban a
char típus 1B-os (8 bites) egész, általában egy-egy karaktert tárol - minden betűnek lesz számértéke (ld. ASCII táblázat - American Standard Code
for Information Interchange)
Karakterlánc (string):
- egy szövegdarab úgy lesz tárolva, hogy
a karakterei egymás mellé kerülnek egy
tömbbe, majd ezeket követi egy 0 értékű bájt.
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:
' ', 'a', '0', '.' stb.'\n' - LineFeed (LF) - ez jelzi a sorok végét'\0' - nullkarakter - ez zárja a karakterláncokat'\t' - vízszintes tab'\r' - carriage return (CR)'\\' - backslash karakter
Szöveg-konstansok:
"hello", "a", "", "abc\ndef"- mindegyiknek a végén van nullkarakter (
'\0')
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;
}
|
HF.
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
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
| #include <iostream>
using namespace std;
int main()
{
char sorok[10][101];
int n;
cin >> n; // '\n'-t bennehagyja
cin.ignore(); // '\n' eldobva
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;
}
|