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
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:
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);
Egy karakter típusú változó értékének kiíratása printf függvénnyel:
printf('Egy char tipusu valtozo erteke: %c \n", valtozo_neve);
Egy int típusú változó értékének kiíratása printf függvénnyel:
printf("Egy int tipusu valtozo erteke: %d \n", valtozo_neve);
Egy double típusú változó értékének kiíratása printf függvénnyel:
printf("Egy double tipusu valtozo erteke: %lf \n", valtozo_neve);
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.
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