Špatné vypsání proměnné – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Špatné vypsání proměnné – C / C++ – Fórum – Programujte.comŠpatné vypsání proměnné – C / C++ – Fórum – Programujte.com

 

Minatory0
Newbie
5. 10. 2008   #1
-
0
-

Mám problém s proměnnou. Program si řekne o nadiktování slova, které vloží jako hodnotu proměnné. Pak se má ta hodnota vypsat, ale místo toho se vypíše vždy druhé písmeno toho slova, které jste zadali.





//#include <cstdlib>
#include <iostream>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[])
{
char moje;
cout << "Napis nejaky text" << endl;
cin.get();
cin >> moje;
cin.get();
cout << "Tohle je tvuj text:" << moje << endl;
system("PAUSE");
return EXIT_SUCCESS;
}




Nahlásit jako SPAM
IP: 85.13.72.–
KIIV
~ Moderátor
+43
God of flame
5. 10. 2008   #2
-
0
-

minimalne ten cin.get() ti jeden znak muze sezrat....

EDIT: jo a char je jeden znak....

Nahlásit jako SPAM
IP: 80.250.27.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Ace McIntosh0
Super člen
5. 10. 2008   #3
-
0
-

No opravdu je chování programu korektní dle syntaxe (ale asi ne podle toho, jak chceš aby se choval, to je jasné:-)). Aby fungoval dle Tvých představ (tj. vypsal napsané slovo), je třeba provést několik úprav:

1. Nejdříve změň deklaraci proměnné moje. V Tvém příkladu je tato proměnná typu char, což znamená že může obsahovat jeden znak. Ty však potřebuješ řetězec znaků, aby se do něj uložilo celé slovo. Takže jednoduše nadeklaruj pole charů, dejme tomu o 20 prvcích:

char moje[20];


2. Nyní máme kam uložit slovo napsané uživatelem. Ovšem s konstrukcí

    cin.get();

cin >> moje;
cin.get();


se nám neuloží korektně - první volání cin.get() ze vstupního proudu načte jeden znak. Tuto metodu voláme bez argumentů, takže dojde k zahození znaku (tj. prvního znaku řetězce, který napsal uživatel). Při volání cin >> moje se ze vstupního proudu načetl další znak (když je proměnná moje typu char) a uložil se do proměnné moje (takže v ní máme ten druhý znak vstupu). Následné volání cin.get() opět načetlo a zahodilo další znak z výstupního proudu (což jsme ale už při výstupu programu nepocítili).

Takže protože chceme uložit celý řetězec do pole moje, použijeme pouze

cin >> moje;


Tím je již program opraven a bude fungovat jak má. Správný zdrojový kód:

#include <iostream>

#include <stdio.h>

using namespace std;

int main(int argc, char *argv[])

{
char moje[20];
cout << "Napis nejaky text" << endl;
cin >> moje;
cin.get();
cout << "Tohle je tvuj text:" << moje << endl;
system("PAUSE");
return EXIT_SUCCESS;
}


EDIT: nj tak KIIV byl rychlejší:-D Příště se s tím nebudu asi tolik psát, páč jsem stejně sdělil to samé co on:-D

Nahlásit jako SPAM
IP: 84.42.174.–
czbero0
Stálý člen
5. 10. 2008   #4
-
0
-

To Ace McIntosh : Proč neustále všichni používáte pole znaků? Vždyť C++ má string, se kterým se pracuje mnohem pohodlněji a není fixovaný na určitou velikost.

Nahlásit jako SPAM
IP: 62.240.178.–
http://moddb.com/mods/police-brutality/
5. 10. 2008   #5
-
0
-

To Minatory : Jasny, za 1) musíš používat pole charů, ne char (char je jenom jeden znak), takže ne "char moje", ale "char moje[50]". Za druhé, cin.get(); čte následující jeden znak, což tady je bezdůvodné, takže ten první můžeš vynechat.

Nahlásit jako SPAM
IP: 83.240.78.–
Podpis: Do podpisu nelze vložit obrázky ani HTML kód. Je podporován nový řádek tagem
.
Minatory0
Newbie
6. 10. 2008   #6
-
0
-

A jak tedy docílím toho, že když chci aby program pokračoval, musí uživatel stisknout Enter?

Nahlásit jako SPAM
IP: 85.207.37.–
Tassadar
~ Anonymní uživatel
5 příspěvků
6. 10. 2008   #7
-
0
-

Poradil bych ti použít cin.getline(moje); načte to celý řádek a přitom čeká na Enter :-) jo a taku musím doporučit stringy

Nahlásit jako SPAM
IP: 82.209.55.–
Minatory0
Newbie
6. 10. 2008   #8
-
0
-

Stringy už používám

Nahlásit jako SPAM
IP: 85.207.37.–
6. 10. 2008   #9
-
0
-

To czbero : Já je třeba používám proto, že mě k tomu nutí moje tutoriálová knížka :-D. Ono je dobré znát řešení jak pro string tak pro pole charů už kvůli znalosti C.

Nahlásit jako SPAM
IP: 83.240.78.–
Podpis: Do podpisu nelze vložit obrázky ani HTML kód. Je podporován nový řádek tagem
.
Ace McIntosh0
Super člen
6. 10. 2008   #10
-
0
-

To czbero : Dle mého je to prostě takhle lepší pro demonstrační účely, aby si člověk uvědomil, že řetězec je vlastně pole znaků, což je základ pro jejich pochopení - také proto se tímto způsobem s řetězci běžně začíná ve výukové literatuře (jinak v praxi, po pochopení problematiky, též souhlasím s použitím stringů, bez pochyb:-)).

Nahlásit jako SPAM
IP: 84.42.174.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 35 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý