Když zkompiluju kód a vytvoří mi to exe soubor, tak ho otevřu a normálně funguje, ale když to někomu pošlu pro zábavu, tak mu to nefunguje. Konkrétně se jedná o tento kód na heslo z lekce 3.
#include <iostream>
using namespace std;
int main()
{
int heslo;
cout << "Zadejte heslo: ";
cin >> heslo;
if (heslo == 1593)
cout << "Tajne slovo je vobrubnik";
else
cout << "Spatne, preji hezky den.";
cin.get();
cin.get();
return 0;
}
Fórum › C / C++
Mě to de a jim ne
To Ymemgirei: připomíná mi to C++/CLI, resp. kombinaci manage a unmanaged kódu ... pokud tomu tak je, tak na koncové mPC potřebuješ .NET Framework
To Jura: OK, jen jsem hádal
To Ymemgirei:
Patrně ve stupní frontě zůstavá více než jeden znak, takže ty znaky sežere cin.get(). Totiž konzolové programy bych raději pouštěl přes konzoli - díky tomu můžeš vidět i výpisy, které se provádí při ukončení programu. Takže jedním řešením může být:
#include <iostream>
using namespace std;
int main()
{
int heslo;
cout << "Zadejte heslo: ";
cin >> heslo;
if (heslo == 1593)
cout << "Tajne slovo je vobrubnik";
else
cout << "Spatne, preji hezky den.";
while(cin.get() != '\n') ; // vyprazdní vstupní frontu
cin.get();
return 0;
}
To Ymemgirei:
To není žádná věda, pořád to patří mezi naprosté základy. Jde jen o to si uvědomit, jak "funguje" objekt cin(to je to, čím načítáš). Objekt cin načítá znaky ze vstupu(to je ta vstupní fronta) po PRVNÍ BÍLÝ znak(bíle znaky jsou napr. mezera, tabulator, enter,...). Tuhle podmínku je velice dobré si uvědomit. No, a když uživatel něco píše na klávesnici, tak se mu(obvykle) ty písmena zobrazují na konsoli, v takovém pořádí v jakém je napsal - tohle zařídí ta fronta(je to stejné jako v obchodě, zařadíš se do fronty a čekáš až na tebe příjde řada, čili zjednodušeně - kdo první přijde, ten bude první obsloužen, říká se tomu FIFO - first in first out). No a jakmile uživatel něco dopíše, zmáčkne enter, tak cin načítá a načíta pěkně písmenko po písmenku dokud nenarází na bílý znak. Jenže tyhle zbylé bílé a další znak(y) nikam nezmizí a zůstanou ve vstupní frontě, tzn. pokud tam něco zůstane, tak další načítaní načte to, co tam zbylo a tím pádem se k uživatelově vstupu už nedostaneš. Takže aby mohlo další načítání proběhnout korektně, musí se fronta vyprázdnit a právě k tomu slouží ta smyčka while(cin.get() != '\n'); -> cin.get() žere ze vstupu naprosto všechno, bez ohledu na to jestli je to bilý znak nebo ne. A načítaš, tak dlouho, dokud se právě vybraný znak nerovná novému řádku(tedy Enteru).
#include <iostream>
using namespace std;
int main()
{
int heslo;
cout << "Zadejte heslo: ";
cin >> heslo; // zadám například 4523__(ty podtržítka jsou mezery)
if (heslo == 1593)
cout << "Tajne slovo je vobrubnik";
else
cout << "Spatne, preji hezky den.";
cin.get(); // sežere jednu mezeru
cin.get(); // sežere druhou mezeru - tím pádem se uživatel vůbec nedostane k možnosti cokkoliv zadat
return 0;
}
2 Ymemgirei: Už to funguje ? (myslim že nie ;) )
ide o to že načítavaš číslo. Pokiaľ niekto zadá napr "abc" vyhodí to výnimku, ktoru nespracuješ, teda program ihneď skončí ;)
skus tomu komu posielaš ten program povedať to heslo ;)
To mephi:
Výjimku to zcela jistě nevyhodí, ale nastaví se fail bit streamu. Nicméně dobrý postřeh, když jsem viděl kód, tak mě vůbec nenapadlo, zadavát něco jiného než číslo. Takže jestli jsem Ymemgireia mystifikoval, tak se omlouvám..
hop, sry naozaj to vynimku nehádže, musel som si to testnuť. Len pre zaujimavosť:
#include <iostream>
using namespace std;
int main()
{
int a;
cout << "vloz cislo:";
cin >> a;
if (cin.fail())
{
cout << "Vstup zlyhal!\n";
}
else
{
cout << "O.K.\n";
}
system("PAUSE");
return 0;
}
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Nelze kompilace pomocí příkazové řádky — založil ondra
Jak dostat stranku asp.net na web — založil Machta
Vložení souboru z kořenového adresáře — založil artorie
Moderátoři diskuze