Ebben a tananyagban túlnyomórészt nem használunk C nyelvből örökölt függvényeket változók értékeinek a kiíratásához, de mivel mások kódjában találkozhatunk velük, így talán érdemes lehet tudni a létezésükről.
Előző tananyagrész: változók, konstansok, literálok
Következő tananyagrész: alaptípusok jellemzői
A guidelineok, coding standardok általában nem javasolják a C nyelvből örökölt függvények használatát C++ programok forráskódjában:
- isocpp.org - Why should I use <iostream> instead of the traditional <cstdio>?
- isocpp.org - prefer iostreams for i/o
- Kate Gregory - stop teaching C (11:11)
Változók értékének kiíratása C nyelvből megörökölt függvényekkel
Bár egy Hello World! string literál kiíratása viszonylag egyszerű printf segítségével (printf("Hello World!");), a változók értékeinek kiíratásához úgynevezett format specifierek használata szükséges a különböző típusú változók esetén. Ebben a tananyagban nem fogom ismertetni az összes format specifiert, csak a legáltalánosabbakat. Az interneten számtalan összesítő táblázatot lehet találni róluk. Például: cplusplus.com - printf
A printf függvény paramétereinek a száma attól függ, hogy hány változó értékét szeretnénk kiíratni egyetlen utasításon belül. Az első paraméter egy string literál, amelyben a format specifierek határozzák meg a további paraméterekként megadott változók értékének helyét a szövegben. Ha a variable1 nevű változó karakter típusú, a variable2 nevű változó pedig int típusú, akkor a printf függvény segítségével például így írathatjuk ki az értékeiket:
printf("variable1 erteke: %c, variable2 erteke: %d \n", variable1, variable2);
Az fprintf függvény is hasonlóan működik, de azt általában fájlba történő íráshoz szoktuk használni. A standard outputra történő kiíratáshoz így használhatjuk:
fprintf(stdout, "variable1 erteke: %c, variable2 erteke: %d \n", variable1, variable2);
char típusú változók, literálok printf függvénnyel történő kiíratásához használjuk a %c format specifiert:
printf("Egy char tipusu valtozo erteke: %c \n", valtozo_neve);
printf("Egy char tipusu literal: %c \n", 'a');
short int típusú változók printf függvénnyel történő kiíratásához használjuk a %hd vagy %hi format specifiert:
printf("Egy short int tipusu valtozo erteke: %hd \n", valtozo_neve);
A C++ nyelvben nem létezik short int típusú literál.
int típusú változók, literálok printf függvénnyel történő kiíratásához használjuk a %d vagy %i format specifiert:
printf("Egy int tipusu valtozo erteke: %d \n", valtozo_neve);
printf("Egy int tipusu literal: %d \n", 128);
long int típusú változók, literálok printf függvénnyel történő kiíratásához használjuk a %ld vagy %li format specifiert:
printf("Egy long int tipusu valtozo erteke: %ld \n", valtozo_neve);
printf("Egy long int tipusu literal: %ld \n", 128L);
long long int típusú változók, literálok printf függvénnyel történő kiíratásához használjuk a %lld vagy %lli format specifiert:
printf("Egy long long int tipusu valtozo erteke: %lld \n", valtozo_neve);
printf("Egy long long int tipusu literal: %lld \n", 128LL);
unsigned int típusú változók, literálok printf függvénnyel történő kiíratásához a format specifierben a d-t vagy az i-t cseréljük ki u-ra, például az unsigned long long int típusú változókat, vagy literálokat a %llu format specifierrel írathatjuk ki:
printf("Egy unsigned long long int tipusu valtozo erteke: %llu \n", valtozo_neve);
printf("Egy unsigned long long int tipusu literal: %llu \n", 128uLL);
float típusú változók, literálok printf függvénnyel történő kiíratásához használjuk a %f format specifiert:
printf("Egy float tipusu valtozo erteke: %f \n", valtozo_neve);
printf("Egy float tipusu literal: %f \n", 1.2f);
double típusú változók, literálok printf függvénnyel történő kiíratásához használjuk az %f vagy %lf format specifiert:
printf("Egy double tipusu valtozo erteke: %lf \n", valtozo_neve);
printf("Egy double tipusu literal: %lf \n", 1.2);
long double típusú változók, literálok printf függvénnyel történő kiíratásához használjuk a %Lf format specifiert:
printf("Egy double tipusu valtozo erteke: %Lf \n", valtozo_neve);
printf("Egy long double tipusu literal: %Lf \n", 1.2L);
Mivel a C nyelvben nincs std::string, így az std::string típusú változók értékét csak akkor tudjuk printf függvény segítségével kiíratni, ha átalakítjuk őket úgynevezett C stringekké (karaktertömbökké). Ezt a c_str() tagfüggvénnyel tehetjük meg.
printf("Egy std::string tipusu valtozo erteke: %s \n", valtozo_neve.c_str() );
std::string típusú változók értékét hasonlóan lehet kiíratni puts és fputs függvényekkel:
puts(valtozo_neve.c_str());
fputs(valtozo_neve.c_str(), stdout);
A puts egy sortörést is tesz a kiírt szöveg után.
A puts és fputs függvény alapvetően csak stringeket tud kiírni, persze át lehet alakítani az alaptípusú változókat std::string típusúvá, de egyrészt erről későbbi tananyagrészben szeretnék írni, másrészt ez így nem túl szép, hogy először átalakítunk egy alaptípusú változót std::stringgé, aztán pedig C stringgé.
//bad practice
#include <cstdio>
#include <string>
int main() {
int variable1 = -128;
fputs(std::to_string(variable1).c_str(), stdout);
}
Ehelyett printf vagy fprintf függvényeket használjunk, ha alaptípusú változók értékét szeretnénk kiíratni.
A nem megfelelő format specifierek használata undefined behaviourt okozhat. Például ha ezt a példaprogramot többször futtatjuk, előfordulhat, hogy mindig más érték íródik ki.
//undefined behavior
#include <cstdio>
int main() {
double variable1 = 1.00007;
printf("%d", variable1);
}
C-ből megörökölt függvények, amikkel változók értékét lehet bekérni a standard inputról
A C nyelvben a legismertebb függvény, amivel parancssorból tudunk változóknak értékeket bekérni a scanf. A printf-hez hasonlóan szintén ügyelnünk kell a format specifierekre, sőt alaptípusú változók esetén a változó neve elé egy & jelet is kell írnunk.
#include <cstdio>
int main() {
printf("Kerem adjon meg egy egesz szamot:\n");
int variable1;
scanf("%d", &variable1);
printf("variable1 erteke: %d", variable1);
}
Akár egyszerre két változó értékét is be tudjuk kérni:
#include <cstdio>
int main() {
printf("Kerem adjon meg ket egesz szamot:\n");
int variable1, variable2;
scanf("%d%d", &variable1, &variable2);
printf("variable1 erteke: %d, variable2 erteke: %d", variable1, variable2);
}
A témához kapcsolódnak még a sprintf, sscanf, fgets függvények, amikkel karaktertömböket lehet kezelni. Külön tananyagrész fog szólni róluk.
https://en.cppreference.com/w/cpp/io/c/fgetc
Egyéb tananyag
- isocpp.org - synchronize iostreams with printf-family functions
- stackoverflow.com - read C++ std::string with scanf
Előző tananyagrész: változók, konstansok, literálok
Következő tananyagrész: alaptípusok jellemzői