{"id":1477,"date":"2026-04-03T13:12:24","date_gmt":"2026-04-03T11:12:24","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1477"},"modified":"2026-04-25T13:16:16","modified_gmt":"2026-04-25T11:16:16","slug":"input-pobiera-dane-wejsciowe-od-uzytkownika-jako-string","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/04\/03\/input-pobiera-dane-wejsciowe-od-uzytkownika-jako-string\/","title":{"rendered":"Input \u2013 pobiera dane wej\u015bciowe od u\u017cytkownika jako string"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Program rzadko dzia\u0142a w ca\u0142kowitym oderwaniu od u\u017cytkownika. Nawet najprostszy kalkulator, skrypt administracyjny czy system rejestracji musi przyj\u0105\u0107 jak\u0105\u015b warto\u015b\u0107 z zewn\u0105trz: liczb\u0119, nazw\u0119, dat\u0119, has\u0142o albo decyzj\u0119 u\u017cytkownika. Na poziomie podstawowym wi\u0119kszo\u015b\u0107 j\u0119zyk\u00f3w programowania traktuje taki odczyt najpierw jako tekst, niezale\u017cnie od tego, co cz\u0142owiek mia\u0142 na my\u015bli. W praktyce podstaw\u0105 takiej komunikacji jest mechanizm Input \u2013 pobiera dane wej\u015bciowe od u\u017cytkownika jako string.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis Tre\u015bci<\/h2><nav><ol><li><a href=\"#input-pobiera-dane-wejsciowe-od-uzytkownika-jako-string-dlaczego-program-zaczyna-wlasnie-od-tekstu\">Input \u2013 pobiera dane wej\u015bciowe od u\u017cytkownika jako string. Dlaczego program zaczyna w\u0142a\u015bnie od tekstu<\/a><\/li><li><a href=\"#roznice-miedzy-odczytem-tekstu-a-rzeczywistym-typem-danych-w-pamieci-programu\">R\u00f3\u017cnice mi\u0119dzy odczytem tekstu a rzeczywistym typem danych w pami\u0119ci programu<\/a><ol><li><a href=\"#przyklady-podstawowego-pobierania-danych-w-roznych-jezykach\">Przyk\u0142ady podstawowego pobierania danych w r\u00f3\u017cnych j\u0119zykach<\/a><\/li><li><a href=\"#przyklad-bledu-wynikajacego-z-braku-konwersji\">Przyk\u0142ad b\u0142\u0119du wynikaj\u0105cego z braku konwersji<\/a><\/li><\/ol><\/li><li><a href=\"#input-pobiera-dane-wejsciowe-od-uzytkownika-jako-string-jak-poprawnie-zamienic-tekst-na-liczbe-lub-inna-strukture-danych\">Input \u2013 pobiera dane wej\u015bciowe od u\u017cytkownika jako string. Jak poprawnie zamieni\u0107 tekst na liczb\u0119 lub inn\u0105 struktur\u0119 danych<\/a><ol><li><a href=\"#konwersja-na-liczbe-calkowita\">Konwersja na liczb\u0119 ca\u0142kowit\u0105<\/a><\/li><li><a href=\"#konwersja-na-liczbe-zmiennoprzecinkowa\">Konwersja na liczb\u0119 zmiennoprzecinkow\u0105<\/a><\/li><li><a href=\"#prosty-wzor-uzywany-po-konwersji-danych\">Prosty wz\u00f3r u\u017cywany po konwersji danych<\/a><\/li><\/ol><\/li><li><a href=\"#walidacja-danych-wejsciowych-i-powod-dla-ktorego-nie-wolno-ufac-uzytkownikowi\">Walidacja danych wej\u015bciowych i pow\u00f3d, dla kt\u00f3rego nie wolno ufa\u0107 u\u017cytkownikowi<\/a><ol><li><a href=\"#przyklad-bezpiecznego-sprawdzania-danych-w-pythonie\">Przyk\u0142ad bezpiecznego sprawdzania danych w Pythonie<\/a><\/li><\/ol><\/li><li><a href=\"#typowe-pulapki-przy-pracy-z-danymi-wejsciowymi-i-bledy-spotykane-na-poczatku-nauki\">Typowe pu\u0142apki przy pracy z danymi wej\u015bciowymi i b\u0142\u0119dy spotykane na pocz\u0105tku nauki<\/a><ol><li><a href=\"#scanf-w-c-i-problem-pozostawionego-znaku-nowej-linii\">scanf() w C i problem pozostawionego znaku nowej linii<\/a><\/li><li><a href=\"#cin-w-c-i-odczyt-tylko-do-spacji\">cin &gt;&gt; w C++ i odczyt tylko do spacji<\/a><\/li><li><a href=\"#python-i-mylne-zalozenie-ze-input-zwraca-liczbe\">Python i mylne za\u0142o\u017cenie, \u017ce input() zwraca liczb\u0119<\/a><\/li><li><a href=\"#php-i-niepozorne-biale-znaki\">PHP i niepozorne bia\u0142e znaki<\/a><\/li><\/ol><\/li><li><a href=\"#input-pobiera-dane-wejsciowe-od-uzytkownika-jako-string-znaczenie-tego-mechanizmu-w-wiekszych-systemach-i-aplikacjach-produkcyjnych\">Input \u2013 pobiera dane wej\u015bciowe od u\u017cytkownika jako string. Znaczenie tego mechanizmu w wi\u0119kszych systemach i aplikacjach produkcyjnych<\/a><\/li><li><a href=\"#faq\">FAQ<\/a><ol><li><a href=\"#dlaczego-dane-od-uzytkownika-nie-sa-od-razu-liczba\">Dlaczego dane od u\u017cytkownika nie s\u0105 od razu liczb\u0105?<\/a><\/li><li><a href=\"#czy-zawsze-trzeba-wykonywac-konwersje-typu\">Czy zawsze trzeba wykonywa\u0107 konwersj\u0119 typu?<\/a><\/li><li><a href=\"#czy-input-w-pythonie-zawsze-zwraca-string\">Czy input() w Pythonie zawsze zwraca string?<\/a><\/li><li><a href=\"#dlaczego-walidacja-jest-wazniejsza-niz-samo-pobranie-danych\">Dlaczego walidacja jest wa\u017cniejsza ni\u017c samo pobranie danych?<\/a><\/li><li><a href=\"#czy-mozna-calkowicie-ufac-formularzom-i-polom-w-interfejsie-graficznym\">Czy mo\u017cna ca\u0142kowicie ufa\u0107 formularzom i polom w interfejsie graficznym?<\/a><\/li><li><a href=\"#kiedy-najlepiej-sprawdzac-poprawnosc-danych\">Kiedy najlepiej sprawdza\u0107 poprawno\u015b\u0107 danych?<\/a><\/li><\/ol><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"input-pobiera-dane-wejsciowe-od-uzytkownika-jako-string-dlaczego-program-zaczyna-wlasnie-od-tekstu\">Input \u2013 pobiera dane wej\u015bciowe od u\u017cytkownika jako string. Dlaczego program zaczyna w\u0142a\u015bnie od tekstu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">System operacyjny, terminal, konsola i standardowe wej\u015bcie nie \u201ewiedz\u0105\u201d, czy wpisane <code>25<\/code> oznacza wiek, liczb\u0119 iteracji czy numer pokoju. Dla programu to ci\u0105g znak\u00f3w. Dopiero logika aplikacji decyduje, jak t\u0119 warto\u015b\u0107 interpretowa\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To rozwi\u0105zanie jest bezpieczne i uniwersalne. Tekst mo\u017cna p\u00f3\u017aniej zamieni\u0107 na liczb\u0119 ca\u0142kowit\u0105, liczb\u0119 zmiennoprzecinkow\u0105, dat\u0119 albo pozostawi\u0107 jako napis. Gdyby program od razu zak\u0142ada\u0142 typ danych, ka\u017cda pomy\u0142ka u\u017cytkownika powodowa\u0142aby wi\u0119kszy chaos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad z \u017cycia:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">u\u017cytkownik wpisuje w terminalu:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>2026<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Program nie ma pewno\u015bci, czy to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>rok,<\/li>\n\n\n\n<li>kod produktu,<\/li>\n\n\n\n<li>liczba zam\u00f3wie\u0144,<\/li>\n\n\n\n<li>identyfikator klienta.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dlatego najpierw odczytuje warto\u015b\u0107 jako tekst, a dopiero potem sprawdza kontekst.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To w\u0142a\u015bnie dlatego b\u0142\u0119dne dane wej\u015bciowe s\u0105 jednym z najcz\u0119stszych \u017ar\u00f3de\u0142 awarii program\u00f3w. Nie problemem jest samo pobranie danych, ale za\u0142o\u017cenie, \u017ce u\u017cytkownik zawsze wpisze dok\u0142adnie to, czego oczekujemy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"roznice-miedzy-odczytem-tekstu-a-rzeczywistym-typem-danych-w-pamieci-programu\">R\u00f3\u017cnice mi\u0119dzy odczytem tekstu a rzeczywistym typem danych w pami\u0119ci programu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">String to sekwencja znak\u00f3w przechowywana w pami\u0119ci. Liczba ca\u0142kowita to ju\u017c warto\u015b\u0107 interpretowana binarnie przez procesor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dla cz\u0142owieka:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>\"15\"<\/code> i <code>15<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">wygl\u0105daj\u0105 podobnie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dla programu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>\"15\"<\/code> to dwa znaki: <code>'1'<\/code> i <code>'5'<\/code><\/li>\n\n\n\n<li><code>15<\/code> to liczba mo\u017cliwa do dodawania, por\u00f3wnywania matematycznego i u\u017cycia w p\u0119tlach<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To rozr\u00f3\u017cnienie jest krytyczne.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi wykonamy:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>\"10\" + \"5\"<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">w Pythonie otrzymamy:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>\"105\"<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">a nie:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>15<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">poniewa\u017c nast\u0119puje konkatenacja tekstu, nie dodawanie matematyczne.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklady-podstawowego-pobierania-danych-w-roznych-jezykach\">Przyk\u0142ady podstawowego pobierania danych w r\u00f3\u017cnych j\u0119zykach<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>imie = input(\"Podaj imi\u0119: \")<\/code><\/td><\/tr><tr><td>C<\/td><td><code>char imie[100]; scanf(\"%99s\", imie);<\/code><\/td><\/tr><tr><td>C++<\/td><td><code>string imie; cin &gt;&gt; imie;<\/code><\/td><\/tr><tr><td>PHP<\/td><td><code>$imie = trim(fgets(STDIN));<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">W ka\u017cdym przypadku pocz\u0105tkowo operujemy na tek\u015bcie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-bledu-wynikajacego-z-braku-konwersji\">Przyk\u0142ad b\u0142\u0119du wynikaj\u0105cego z braku konwersji<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>wiek = input(\"Podaj wiek: \")<\/code><br><code>print(wiek + 5)<\/code><\/td><\/tr><tr><td>Efekt<\/td><td>b\u0142\u0105d typu, poniewa\u017c program pr\u00f3buje po\u0142\u0105czy\u0107 tekst z liczb\u0105<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dlatego potrzebna jest konwersja typu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"input-pobiera-dane-wejsciowe-od-uzytkownika-jako-string-jak-poprawnie-zamienic-tekst-na-liczbe-lub-inna-strukture-danych\">Input \u2013 pobiera dane wej\u015bciowe od u\u017cytkownika jako string. Jak poprawnie zamieni\u0107 tekst na liczb\u0119 lub inn\u0105 struktur\u0119 danych<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Konwersja typu to \u015bwiadome poinformowanie programu, \u017ce dany tekst ma zosta\u0107 potraktowany jako inny rodzaj danych.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119\u015bciej u\u017cywane konwersje:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>string \u2192 int<\/li>\n\n\n\n<li>string \u2192 float<\/li>\n\n\n\n<li>string \u2192 bool<\/li>\n\n\n\n<li>string \u2192 lista warto\u015bci<\/li>\n\n\n\n<li>string \u2192 data<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Najwi\u0119kszy problem pojawia si\u0119 wtedy, gdy u\u017cytkownik wpisze co\u015b niepoprawnego.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi oczekujemy liczby:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>18<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">a u\u017cytkownik wpisze:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>osiemna\u015bcie<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">program bez zabezpiecze\u0144 zako\u0144czy dzia\u0142anie b\u0142\u0119dem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"konwersja-na-liczbe-calkowita\">Konwersja na liczb\u0119 ca\u0142kowit\u0105<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>wiek = int(input(\"Podaj wiek: \"))<\/code><\/td><\/tr><tr><td>C++<\/td><td><code>string txt; cin &gt;&gt; txt; int wiek = stoi(txt);<\/code><\/td><\/tr><tr><td>PHP<\/td><td><code>$wiek = (int) trim(fgets(STDIN));<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To dzia\u0142a tylko wtedy, gdy dane s\u0105 poprawne.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"konwersja-na-liczbe-zmiennoprzecinkowa\">Konwersja na liczb\u0119 zmiennoprzecinkow\u0105<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>cena = float(input(\"Podaj cen\u0119: \"))<\/code><\/td><\/tr><tr><td>C++<\/td><td><code>double cena; cin &gt;&gt; cena;<\/code><\/td><\/tr><tr><td>PHP<\/td><td><code>$cena = (float) trim(fgets(STDIN));<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Tu pojawia si\u0119 dodatkowy problem separatora dziesi\u0119tnego:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>cz\u0119\u015b\u0107 u\u017cytkownik\u00f3w wpisuje <code>12.5<\/code><\/li>\n\n\n\n<li>cz\u0119\u015b\u0107 wpisuje <code>12,5<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Program musi wiedzie\u0107, kt\u00f3r\u0105 wersj\u0119 akceptuje.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"prosty-wzor-uzywany-po-konwersji-danych\">Prosty wz\u00f3r u\u017cywany po konwersji danych<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Zastosowanie<\/th><th>Wz\u00f3r<\/th><\/tr><\/thead><tbody><tr><td>Pole prostok\u0105ta<\/td><td><code>P = a \u00d7 b<\/code><\/td><\/tr><tr><td>\u015arednia arytmetyczna<\/td><td><code>S = (a + b + c) \/ 3<\/code><\/td><\/tr><tr><td>Procent<\/td><td><code>warto\u015b\u0107 = ca\u0142o\u015b\u0107 \u00d7 procent \/ 100<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Bez poprawnej konwersji takich oblicze\u0144 nie da si\u0119 wykona\u0107 poprawnie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"walidacja-danych-wejsciowych-i-powod-dla-ktorego-nie-wolno-ufac-uzytkownikowi\">Walidacja danych wej\u015bciowych i pow\u00f3d, dla kt\u00f3rego nie wolno ufa\u0107 u\u017cytkownikowi<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Walidacja nie oznacza braku zaufania do cz\u0142owieka. Oznacza ochron\u0119 programu przed rzeczywisto\u015bci\u0105.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">U\u017cytkownik mo\u017ce:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>wpisa\u0107 liter\u0119 zamiast liczby,<\/li>\n\n\n\n<li>wklei\u0107 spacj\u0119,<\/li>\n\n\n\n<li>nacisn\u0105\u0107 Enter bez tre\u015bci,<\/li>\n\n\n\n<li>u\u017cy\u0107 przecinka zamiast kropki,<\/li>\n\n\n\n<li>poda\u0107 warto\u015b\u0107 ujemn\u0105 tam, gdzie nie ma sensu,<\/li>\n\n\n\n<li>wklei\u0107 bardzo d\u0142ugi tekst,<\/li>\n\n\n\n<li>celowo pr\u00f3bowa\u0107 uszkodzi\u0107 system.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">W praktyce w\u0142a\u015bnie te sytuacje powoduj\u0105 najwi\u0119cej strat czasu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-bezpiecznego-sprawdzania-danych-w-pythonie\">Przyk\u0142ad bezpiecznego sprawdzania danych w Pythonie<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Cel<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Sprawdzenie poprawnej liczby<\/td><td><code>while True:<\/code><br><code>try:<\/code><br><code>wiek = int(input(\"Podaj wiek: \"))<\/code><br><code>break<\/code><br><code>except ValueError:<\/code><br><code>print(\"B\u0142\u0119dna warto\u015b\u0107\")<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To prosty, ale bardzo wa\u017cny mechanizm.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bez niego program dzia\u0142a dobrze tylko wtedy, gdy u\u017cytkownik zachowuje si\u0119 idealnie, a to w praktyce prawie si\u0119 nie zdarza.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"typowe-pulapki-przy-pracy-z-danymi-wejsciowymi-i-bledy-spotykane-na-poczatku-nauki\">Typowe pu\u0142apki przy pracy z danymi wej\u015bciowymi i b\u0142\u0119dy spotykane na pocz\u0105tku nauki<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"scanf-w-c-i-problem-pozostawionego-znaku-nowej-linii\"><code>scanf()<\/code> w C i problem pozostawionego znaku nowej linii<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Po odczycie danych w C cz\u0119sto w buforze zostaje znak Enter. Nast\u0119pny odczyt mo\u017ce zachowywa\u0107 si\u0119 nieoczekiwanie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To jeden z klasycznych problem\u00f3w pocz\u0105tkuj\u0105cych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"cin-w-c-i-odczyt-tylko-do-spacji\"><code>cin &gt;&gt;<\/code> w C++ i odczyt tylko do spacji<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi u\u017cytkownik wpisze:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Jan Kowalski<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">to zwyk\u0142e:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>cin &gt;&gt; imie;<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">odczyta tylko:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Jan<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Do pe\u0142nych linii trzeba u\u017cywa\u0107 <code>getline()<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"python-i-mylne-zalozenie-ze-input-zwraca-liczbe\">Python i mylne za\u0142o\u017cenie, \u017ce <code>input()<\/code> zwraca liczb\u0119<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To bardzo cz\u0119sty b\u0142\u0105d:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>liczba = input()<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">a potem:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>liczba * 2<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dla tekstu <code>\"5\"<\/code> wynik mo\u017ce by\u0107 zaskakuj\u0105cy:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>\"55\"<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bo nast\u0119puje powielenie tekstu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"php-i-niepozorne-biale-znaki\">PHP i niepozorne bia\u0142e znaki<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>fgets()<\/code> pobiera r\u00f3wnie\u017c znak ko\u0144ca linii. Dlatego cz\u0119sto konieczne jest u\u017cycie <code>trim()<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bez tego por\u00f3wnania tekst\u00f3w potrafi\u0105 zachowywa\u0107 si\u0119 pozornie losowo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"input-pobiera-dane-wejsciowe-od-uzytkownika-jako-string-znaczenie-tego-mechanizmu-w-wiekszych-systemach-i-aplikacjach-produkcyjnych\">Input \u2013 pobiera dane wej\u015bciowe od u\u017cytkownika jako string. Znaczenie tego mechanizmu w wi\u0119kszych systemach i aplikacjach produkcyjnych<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ten sam mechanizm wyst\u0119puje nie tylko w konsoli.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Formularz WWW, API, import CSV, plik konfiguracyjny, dane z czujnika, parametry uruchomienia programu &#8211; wszystko to zaczyna si\u0119 od danych zewn\u0119trznych, kt\u00f3re trzeba zinterpretowa\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">System bankowy nie ufa kwocie wpisanej przez u\u017cytkownika.<br>Sklep internetowy nie ufa cenie przes\u0142anej z przegl\u0105darki.<br>Panel administracyjny nie ufa identyfikatorowi w URL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Najpierw odczyt.<br>Potem walidacja.<br>Dopiero p\u00f3\u017aniej logika biznesowa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pomini\u0119cie tego porz\u0105dku prowadzi nie tylko do b\u0142\u0119d\u00f3w technicznych, ale te\u017c do realnych strat pieni\u0119dzy i problem\u00f3w bezpiecze\u0144stwa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-dane-od-uzytkownika-nie-sa-od-razu-liczba\">Dlaczego dane od u\u017cytkownika nie s\u0105 od razu liczb\u0105?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Poniewa\u017c standardowe wej\u015bcie przekazuje znaki tekstowe. Program sam decyduje, czy maj\u0105 zosta\u0107 potraktowane jako liczba, data czy zwyk\u0142y napis.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-zawsze-trzeba-wykonywac-konwersje-typu\">Czy zawsze trzeba wykonywa\u0107 konwersj\u0119 typu?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie. Je\u015bli rzeczywi\u015bcie potrzebny jest tekst, konwersja nie jest konieczna. Jest potrzebna wtedy, gdy planowane s\u0105 obliczenia lub operacje zale\u017cne od konkretnego typu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-input-w-pythonie-zawsze-zwraca-string\">Czy <code>input()<\/code> w Pythonie zawsze zwraca string?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tak. Niezale\u017cnie od tego, czy u\u017cytkownik wpisze <code>5<\/code>, <code>3.14<\/code> czy <code>ABC<\/code>, wynik pocz\u0105tkowo jest napisem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-walidacja-jest-wazniejsza-niz-samo-pobranie-danych\">Dlaczego walidacja jest wa\u017cniejsza ni\u017c samo pobranie danych?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bo b\u0142\u0119dne dane potrafi\u0105 zatrzyma\u0107 program albo uszkodzi\u0107 logik\u0119 dzia\u0142ania. Sam odczyt jest prosty, problem zaczyna si\u0119 przy za\u0142o\u017ceniu, \u017ce dane s\u0105 poprawne.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-mozna-calkowicie-ufac-formularzom-i-polom-w-interfejsie-graficznym\">Czy mo\u017cna ca\u0142kowicie ufa\u0107 formularzom i polom w interfejsie graficznym?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie. Nawet je\u015bli interfejs wygl\u0105da poprawnie, dane mog\u0105 zosta\u0107 zmienione r\u0119cznie, przes\u0142ane z innego \u017ar\u00f3d\u0142a albo celowo sfa\u0142szowane.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"kiedy-najlepiej-sprawdzac-poprawnosc-danych\">Kiedy najlepiej sprawdza\u0107 poprawno\u015b\u0107 danych?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Jak najwcze\u015bniej &#8211; zaraz po odczycie. Im p\u00f3\u017aniej wykryty b\u0142\u0105d, tym trudniej ustali\u0107 jego \u017ar\u00f3d\u0142o i tym wi\u0119ksze ryzyko uszkodzenia dalszej logiki programu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mechanizm pobierania danych wydaje si\u0119 prosty tylko na pocz\u0105tku nauki. W praktyce to jedno z miejsc, gdzie naj\u0142atwiej o b\u0142\u0119dy i jednocze\u015bnie jedno z najwa\u017cniejszych miejsc dla stabilno\u015bci programu. Dobrze napisany kod zaczyna si\u0119 nie od skomplikowanych algorytm\u00f3w, ale od poprawnego przyj\u0119cia tego, co wpisuje cz\u0142owiek.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u0179r\u00f3d\u0142o Foto: Freepik<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Program rzadko dzia\u0142a w ca\u0142kowitym oderwaniu od u\u017cytkownika. Nawet najprostszy kalkulator, skrypt administracyjny czy system rejestracji musi przyj\u0105\u0107 jak\u0105\u015b warto\u015b\u0107 z zewn\u0105trz: liczb\u0119, nazw\u0119, dat\u0119, has\u0142o albo decyzj\u0119 u\u017cytkownika. Na poziomie podstawowym wi\u0119kszo\u015b\u0107 j\u0119zyk\u00f3w programowania traktuje taki odczyt najpierw jako tekst, niezale\u017cnie od tego, co cz\u0142owiek mia\u0142 na my\u015bli. W praktyce podstaw\u0105 takiej komunikacji jest mechanizm Input \u2013 pobiera dane wej\u015bciowe od u\u017cytkownika jako string. Input \u2013 pobiera dane wej\u015bciowe od u\u017cytkownika jako string. Dlaczego program zaczyna w\u0142a\u015bnie od tekstu System operacyjny, terminal, konsola i standardowe wej\u015bcie nie \u201ewiedz\u0105\u201d, czy wpisane 25 oznacza wiek, liczb\u0119 iteracji czy numer pokoju. Dla programu to ci\u0105g znak\u00f3w. Dopiero logika aplikacji decyduje, jak t\u0119 warto\u015b\u0107 interpretowa\u0107. To rozwi\u0105zanie jest bezpieczne i uniwersalne. Tekst mo\u017cna p\u00f3\u017aniej zamieni\u0107 na liczb\u0119 ca\u0142kowit\u0105, liczb\u0119 zmiennoprzecinkow\u0105, dat\u0119 albo pozostawi\u0107 jako napis. Gdyby program od razu zak\u0142ada\u0142 typ danych, ka\u017cda pomy\u0142ka u\u017cytkownika powodowa\u0142aby wi\u0119kszy chaos. Przyk\u0142ad z \u017cycia: u\u017cytkownik wpisuje w terminalu: 2026 Program nie ma pewno\u015bci, czy to: Dlatego najpierw odczytuje warto\u015b\u0107 jako tekst, a dopiero potem sprawdza kontekst. To w\u0142a\u015bnie dlatego b\u0142\u0119dne dane wej\u015bciowe s\u0105 jednym z najcz\u0119stszych \u017ar\u00f3de\u0142 awarii program\u00f3w. Nie problemem jest samo pobranie danych, ale za\u0142o\u017cenie, \u017ce u\u017cytkownik zawsze wpisze dok\u0142adnie to, czego oczekujemy. R\u00f3\u017cnice mi\u0119dzy odczytem tekstu a rzeczywistym typem danych w pami\u0119ci programu String to sekwencja znak\u00f3w przechowywana w pami\u0119ci. Liczba ca\u0142kowita to ju\u017c warto\u015b\u0107 interpretowana binarnie przez procesor. Dla cz\u0142owieka: &#8222;15&#8221; i 15 wygl\u0105daj\u0105 podobnie. Dla programu: To rozr\u00f3\u017cnienie jest krytyczne. Je\u017celi wykonamy: &#8222;10&#8221; + &#8222;5&#8221; w Pythonie otrzymamy: &#8222;105&#8221; a nie: 15 poniewa\u017c nast\u0119puje konkatenacja tekstu, nie dodawanie matematyczne. Przyk\u0142ady podstawowego pobierania danych w r\u00f3\u017cnych j\u0119zykach J\u0119zyk Kod Python imie = input(&#8222;Podaj imi\u0119: &#8222;) C char imie[100]; scanf(&#8222;%99s&#8221;, imie); C++ string imie; cin &gt;&gt; imie; PHP $imie = trim(fgets(STDIN)); W ka\u017cdym przypadku pocz\u0105tkowo operujemy na tek\u015bcie. Przyk\u0142ad b\u0142\u0119du wynikaj\u0105cego z braku konwersji J\u0119zyk Kod Python wiek = input(&#8222;Podaj wiek: &#8222;)print(wiek + 5) Efekt b\u0142\u0105d typu, poniewa\u017c program pr\u00f3buje po\u0142\u0105czy\u0107 tekst z liczb\u0105 Dlatego potrzebna jest konwersja typu. Input \u2013 pobiera dane wej\u015bciowe od u\u017cytkownika jako string. Jak poprawnie zamieni\u0107 tekst na liczb\u0119 lub inn\u0105 struktur\u0119 danych Konwersja typu to \u015bwiadome poinformowanie programu, \u017ce dany tekst ma zosta\u0107 potraktowany jako inny rodzaj danych. Najcz\u0119\u015bciej u\u017cywane konwersje: Najwi\u0119kszy problem pojawia si\u0119 wtedy, gdy u\u017cytkownik wpisze co\u015b niepoprawnego. Je\u017celi oczekujemy liczby: 18 a u\u017cytkownik wpisze: osiemna\u015bcie program bez zabezpiecze\u0144 zako\u0144czy dzia\u0142anie b\u0142\u0119dem. Konwersja na liczb\u0119 ca\u0142kowit\u0105 J\u0119zyk Kod Python wiek = int(input(&#8222;Podaj wiek: &#8222;)) C++ string txt; cin &gt;&gt; txt; int wiek = stoi(txt); PHP $wiek = (int) trim(fgets(STDIN)); To dzia\u0142a tylko wtedy, gdy dane s\u0105 poprawne. Konwersja na liczb\u0119 zmiennoprzecinkow\u0105 J\u0119zyk Kod Python cena = float(input(&#8222;Podaj cen\u0119: &#8222;)) C++ double cena; cin &gt;&gt; cena; PHP $cena = (float) trim(fgets(STDIN)); Tu pojawia si\u0119 dodatkowy problem separatora dziesi\u0119tnego: Program musi wiedzie\u0107, kt\u00f3r\u0105 wersj\u0119 akceptuje. Prosty wz\u00f3r u\u017cywany po konwersji danych Zastosowanie Wz\u00f3r Pole prostok\u0105ta P = a \u00d7 b \u015arednia arytmetyczna S = (a + b + c) \/ 3 Procent warto\u015b\u0107 = ca\u0142o\u015b\u0107 \u00d7 procent \/ 100 Bez poprawnej konwersji takich oblicze\u0144 nie da si\u0119 wykona\u0107 poprawnie. Walidacja danych wej\u015bciowych i pow\u00f3d, dla kt\u00f3rego nie wolno ufa\u0107 u\u017cytkownikowi Walidacja nie oznacza braku zaufania do cz\u0142owieka. Oznacza ochron\u0119 programu przed rzeczywisto\u015bci\u0105. U\u017cytkownik mo\u017ce: W praktyce w\u0142a\u015bnie te sytuacje powoduj\u0105 najwi\u0119cej strat czasu. Przyk\u0142ad bezpiecznego sprawdzania danych w Pythonie Cel Kod Sprawdzenie poprawnej liczby while True:try:wiek = int(input(&#8222;Podaj wiek: &#8222;))breakexcept ValueError:print(&#8222;B\u0142\u0119dna warto\u015b\u0107&#8221;) To prosty, ale bardzo wa\u017cny mechanizm. Bez niego program dzia\u0142a dobrze tylko wtedy, gdy u\u017cytkownik zachowuje si\u0119 idealnie, a to w praktyce prawie si\u0119 nie zdarza. Typowe pu\u0142apki przy pracy z danymi wej\u015bciowymi i b\u0142\u0119dy spotykane na pocz\u0105tku nauki scanf() w C i problem pozostawionego znaku nowej linii Po odczycie danych w C cz\u0119sto w buforze zostaje znak Enter. Nast\u0119pny odczyt mo\u017ce zachowywa\u0107 si\u0119 nieoczekiwanie. To jeden z klasycznych problem\u00f3w pocz\u0105tkuj\u0105cych. cin &gt;&gt; w C++ i odczyt tylko do spacji Je\u017celi u\u017cytkownik wpisze: Jan Kowalski to zwyk\u0142e: cin &gt;&gt; imie; odczyta tylko: Jan Do pe\u0142nych linii trzeba u\u017cywa\u0107 getline(). Python i mylne za\u0142o\u017cenie, \u017ce input() zwraca liczb\u0119 To bardzo cz\u0119sty b\u0142\u0105d: liczba = input() a potem: liczba * 2 Dla tekstu &#8222;5&#8221; wynik mo\u017ce by\u0107 zaskakuj\u0105cy: &#8222;55&#8221; bo nast\u0119puje powielenie tekstu. PHP i niepozorne bia\u0142e znaki fgets() pobiera r\u00f3wnie\u017c znak ko\u0144ca linii. Dlatego cz\u0119sto konieczne jest u\u017cycie trim(). Bez tego por\u00f3wnania tekst\u00f3w potrafi\u0105 zachowywa\u0107 si\u0119 pozornie losowo. Input \u2013 pobiera dane wej\u015bciowe od u\u017cytkownika jako string. Znaczenie tego mechanizmu w wi\u0119kszych systemach i aplikacjach produkcyjnych Ten sam mechanizm wyst\u0119puje nie tylko w konsoli. Formularz WWW, API, import CSV, plik konfiguracyjny, dane z czujnika, parametry uruchomienia programu &#8211; wszystko to zaczyna si\u0119 od danych zewn\u0119trznych, kt\u00f3re trzeba zinterpretowa\u0107. System bankowy nie ufa kwocie wpisanej przez u\u017cytkownika.Sklep internetowy nie ufa cenie przes\u0142anej z przegl\u0105darki.Panel administracyjny nie ufa identyfikatorowi w URL. Najpierw odczyt.Potem walidacja.Dopiero p\u00f3\u017aniej logika biznesowa. Pomini\u0119cie tego porz\u0105dku prowadzi nie tylko do b\u0142\u0119d\u00f3w technicznych, ale te\u017c do realnych strat pieni\u0119dzy i problem\u00f3w bezpiecze\u0144stwa. FAQ Dlaczego dane od u\u017cytkownika nie s\u0105 od razu liczb\u0105? Poniewa\u017c standardowe wej\u015bcie przekazuje znaki tekstowe. Program sam decyduje, czy maj\u0105 zosta\u0107 potraktowane jako liczba, data czy zwyk\u0142y napis. Czy zawsze trzeba wykonywa\u0107 konwersj\u0119 typu? Nie. Je\u015bli rzeczywi\u015bcie potrzebny jest tekst, konwersja nie jest konieczna. Jest potrzebna wtedy, gdy planowane s\u0105 obliczenia lub operacje zale\u017cne od konkretnego typu. Czy input() w Pythonie zawsze zwraca string? Tak. Niezale\u017cnie od tego, czy u\u017cytkownik wpisze 5, 3.14 czy ABC, wynik pocz\u0105tkowo jest napisem. Dlaczego walidacja jest wa\u017cniejsza ni\u017c samo pobranie danych? Bo b\u0142\u0119dne dane potrafi\u0105 zatrzyma\u0107 program albo uszkodzi\u0107 logik\u0119 dzia\u0142ania. Sam odczyt jest prosty, problem zaczyna si\u0119 przy za\u0142o\u017ceniu, \u017ce dane s\u0105 poprawne. Czy mo\u017cna ca\u0142kowicie ufa\u0107 formularzom i polom w interfejsie graficznym? Nie. Nawet je\u015bli interfejs wygl\u0105da poprawnie, dane mog\u0105 zosta\u0107 zmienione r\u0119cznie, przes\u0142ane z innego \u017ar\u00f3d\u0142a albo celowo sfa\u0142szowane. Kiedy najlepiej sprawdza\u0107 poprawno\u015b\u0107 danych? Jak najwcze\u015bniej &#8211; zaraz po odczycie. Im p\u00f3\u017aniej wykryty b\u0142\u0105d, tym trudniej ustali\u0107 jego \u017ar\u00f3d\u0142o i tym wi\u0119ksze ryzyko uszkodzenia dalszej logiki programu. Mechanizm pobierania danych wydaje si\u0119 prosty tylko na pocz\u0105tku nauki. W praktyce to jedno z miejsc, gdzie naj\u0142atwiej o b\u0142\u0119dy i jednocze\u015bnie jedno z najwa\u017cniejszych miejsc dla stabilno\u015bci programu. Dobrze napisany kod zaczyna si\u0119 nie od skomplikowanych algorytm\u00f3w, ale od poprawnego przyj\u0119cia tego, co wpisuje cz\u0142owiek. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1478,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[],"class_list":["post-1477","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jezyk-programowania"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1477","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1477"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1477\/revisions"}],"predecessor-version":[{"id":1479,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1477\/revisions\/1479"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1478"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1477"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1477"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1477"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}