[itk] Számítástechnika kezdőknek

C++ programozás kezdőknek - alaptípusú változók kezelése C nyelvből örökölt függvényekkel

[2020. december 27.] [ christo161 ]

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:

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

Előző tananyagrész: változók, konstansok, literálok
Következő tananyagrész: alaptípusok jellemzői

A bejegyzés trackback címe:

https://itkezdoknek.blog.hu/api/trackback/id/tr3116356650

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása