Ošetření vstupu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ošetření vstupu – C / C++ – Fórum – Programujte.comOšetření vstupu – C / C++ – Fórum – Programujte.com

 

Koja
~ Anonymní uživatel
37 příspěvků
3. 11. 2008   #1
-
0
-

Zdravím, mám kod

while ((PocetPrvku = scanf("%lf", &cislo)) != EOF)

{
if (PocetPrvku == 0) // chybne zadane cislo
{
//nejaka chybova hlaska
return EXIT_SUCCESS;
}

pole[pocitadlo] = cislo;
pocitadlo++;

}
//volani nejaky funce, co prebira ty cisla


Volání na tu funkci, co přebírá čísla se provádí vždycky, když dám CTRL+D neboli, když je úplně konec. A já bych potřeboval, aby to dělalo pokaždý, když zmáčknu ENTER .. zkoušel sem to různě, ale furt mi to nefunguje, nevíte někdo, jak na to? :/

Nahlásit jako SPAM
IP: 81.27.200.–
Romi
~ Anonymní uživatel
9 příspěvků
3. 11. 2008   #2
-
0
-

Stiskem Enter odřádkuješ, takže vlastně "napíšeš" znak novýho řadku, kterej se v C zapíše jako '\n'. Místo EOF si hlídej ten novej řádek...

Nahlásit jako SPAM
IP: 147.229.197.–
Koja
~ Anonymní uživatel
37 příspěvků
4. 11. 2008   #3
-
0
-

To je mi jasny, že si musím hlídat '\n', jenže jak? Nic mi nefunguje .. a to EOF tam potřebuju, aby mi to dělal, dokud nestitknu to CTRL+C.
Takže budu zadávat čísla .. enter .. provede výpočet .. budu zadávat dál .. enter .. výpočet .. čísla .. enter .. výpočet .. čísla ... CTR+C .. výpočet, konec.

Nahlásit jako SPAM
IP: 147.229.65.–
KIIV
~ Moderátor
+43
God of flame
4. 11. 2008   #4
-
0
-

v nejhorsim pripade muzes nacist jeden radek celej a nechat ho prohnat sscanf

pripadne to prolejzat po znacich a rosekat to podle "bilejch" znaku

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Romi
~ Anonymní uživatel
9 příspěvků
4. 11. 2008   #5
-
0
-

Aha když to chceš odchytit obojí, tak to jde napsat třeba takhle:



while ((PocetPrvku = scanf("%lf", &cislo)) != EOF)
{ // scanf zpracovava vstup podle specifikovane konverze (%d%lff..), jakmile konverzi vstup neodpovida, skonci
if (PocetPrvku == 0) // chybne zadane cislo
{ //nejaka chybova hlaska
return EXIT_SUCCESS;
}

pole[pocitadlo++] = cislo;

if ( (c = getchar) == '\n')
{ // neni nahodou za vstupem ktery zpacoval scanf konec radku?
// ANO, tak zavolame si zavolame nejakou funci..
}
}

Nahlásit jako SPAM
IP: 147.229.197.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
4. 11. 2008   #6
-
0
-

To Romi : to sem zkoušel jako jedno z prvních a nefunguje to:)
To KIIV : můžeš mi to víc popsat, prosím tě?

Nahlásit jako SPAM
IP: 147.229.9.–
Jura
~ Anonymní uživatel
637 příspěvků
4. 11. 2008   #7
-
0
-

Jen si je dobré uvědomit, jak funguje scanf - bere znaky jen po první bílý znak, mezi které patri i '\n', který přečte a pak zahodí, takže na něj reagovat ve smyčce neni příliš vhodný nápad.



#include <stdio.h>
//#include <locale.h> // setlocale

#define MAX_BUF 256

void func(double dNum)
{
printf("%.2lf ^ 2 = %.2lf\n", dNum , dNum*dNum );
}

int main()
{
//setlocale(LC_ALL, "");
double dNum = 0;
int iCount = 0;
while( (iCount = scanf(" %lf", &dNum)) != EOF )
{
if( iCount > 0)
func(dNum);
else
{
clearerr(stdin);
fprintf(stderr, "Bad input\n");

}
fflush(stdin);
}
//setlocale(LC_ALL, "English");

getchar();
return 0;
}

Nahlásit jako SPAM
IP: 85.207.192.–
Koja
~ Anonymní uživatel
37 příspěvků
4. 11. 2008   #8
-
0
-

To Jura : Díky moc, s tím už si pohraju :)

Nahlásit jako SPAM
IP: 147.229.9.–
Romi
~ Anonymní uživatel
9 příspěvků
4. 11. 2008   #9
-
0
-

To Jura : S timhle souhlasím: "Jen si je dobré uvědomit, jak funguje scanf - bere znaky jen po první bílý znak, mezi které patri i '\n'", ale s timhle už ne: "který přečte a pak zahodí". Já myslim, že ho nezahodí. Jak by moh potom fungovat kód dole?

To Koja : Buď nevim, co přesně chceš, nebo si to zkoušel blbě, pač mě to funguje.. Viz kód, do pole se načítaj zadaný čísla, po Entru se provede výpočet a když dáš Ctrl+D tak program skončí..



#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
int PocetPrvku, c, pocitadlo = 0, pole [100];
double cislo;
while ((PocetPrvku = scanf("%lf", &cislo)) != EOF)
{ /* scanf zpracovava vstup podle specifikovane konverze,
jakmile konverzi vstup neodpovida, skonci */
if (PocetPrvku == 0) // chybne zadane cislo
{ //nejaka chybova hlaska
printf("Chybny vstup\n");
return EXIT_SUCCESS;
}

pole[pocitadlo++] = cislo;

printf("obsah pole: ");
for (int i = 0; i < pocitadlo; i++)
printf("%d ", pole[i]);
printf("\n");

// neni nahodou za vstupem ktery zpacoval scanf konec radku?
if ((c = getchar()) == '\n')
{ // ANO, tak zavolame si zavolame nejakou funci..
printf("vypocet..\n");
}
}
return EXIT_SUCCESS;
}


Jinak překládáno na WinXP pomocí GCC verzi nevim (součást IDE Code::Blocks) a funguje tak jak píšu..

Nahlásit jako SPAM
IP: 147.229.197.–
Jura
~ Anonymní uživatel
637 příspěvků
4. 11. 2008   #10
-
0
-

To Romi :
Sorry, máš pravdu, špatně jsem si to v dokumentaci přečetl. Akorát jsem tvé předchozí řešení nečetl. Pak to samozřejmě fungovat bude, máš pravdu. Jenže oba naše řešení ztroskotají např. na vstupu 45er8(chtěl jsem zadat jen 45e8) - pak je to jasná chyba, bohužel moje řešení přečte pouze 45 a tvé jak 45, tak 8 (kvůli tomu očekávaní \n), ale to plyne z chovaní scanf. Takže pokud chce opravdu mít kontrolu nad vstupem, tak asi scanf nabude to správné řešení. Pak bych se přikláněl k tomu, co zde zmiňoval KIIV tedy načíst do řetězce a ten pak konvertovat(raději pomocí strtod).

Nahlásit jako SPAM
IP: 85.207.192.–
Romi
~ Anonymní uživatel
9 příspěvků
4. 11. 2008   #11
-
0
-

To Jura : Nj pravda to 45er8.. Já počítal jenom s celýma číslama :) Pak souhlas, že pokud to chce mít maximálně ošetřený, tak načíst do řetězce a pak konvertovat na double.. Ještě by to šlo udělat hrubou silou a načítat znak po znaku, ale to by nebylo zrovna elegantí řešení :smile5:

Nahlásit jako SPAM
IP: 147.229.197.–
Koja
~ Anonymní uživatel
37 příspěvků
4. 11. 2008   #12
-
0
-

To Romi : Už mi to taky valí, díky :)

Nahlásit jako SPAM
IP: 81.27.200.–
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, 45 hostů

Podobná vlákna

Ošetření vstupu — založil Caken

Ošetření vstupů — založil vollf82

Ošetření vstupu. — založil jisla

Ošetření vstupu — založil Troy585

Ošetření vstupu — založil Erlesh

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ý