Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

Diskuze: Ošetření vstupu

C a C++ C a C++ Ošetření vstupu American English version English version

Aktivity (1)
Avatar
Kubas129
Člen
Avatar
Kubas129:28. října 15:45

ahoj,
můžu ještě poprosit o kus kodu na ošetření vstupu
potřeboval bych, když vložím do konzole: 1 2
3 abcd
aby se hned vypsala věta: nespravny vstup

 
Odpovědět 28. října 15:45
Avatar
Kubas129
Člen
Avatar
Kubas129:28. října 15:50

zjednodušeně řešeno:
Bod B: se nesmí vypsat, pokud jsem zadal špatně data do bodu A

 
Nahoru Odpovědět 28. října 15:50
Avatar
Odpovídá na Kubas129
Ondřej Štorc:28. října 16:29

To jsi se s řešením DU na FITu moc nenadřel... Jinak máš špatně tu podmínku. Ve scanf načítáš dvě hodnoty, ale to podmínka tomu vůbec neodpovídá:

if(scanf(" %lf %lf", &a, &b) != 2)
{
        // Pokud jsi zde, tak se nenačetly dvě hodnoty...
}
Nahoru Odpovědět 28. října 16:29
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Kubas129
DarkCoder:28. října 16:52

Mnohem lepší způsob než deklarovat několik dvouprvkových polí je vytvořit si tříprvkové pole struktůr se dvěma členy (int nebo double dle tvé potřeby). Důvodem je mnohem lepší čitelnost toho s čím aktuálně pracuješ.

Dále pokud očekávám na vstupu zadání dvou hodnot, nebudu chtít, aby mi uživatel zadal hodnoty čtyři. Funkce scanf() vrací počet úspěšně načtených členů a tedy pokud očekávám dva, porovnávám návratovou hodnotu s hodnotou 2. Ukončovat program když není vstup správně zadán je trochu drastická metoda. Mnohem lepší by bylo hodnotu načítat v do-while cyklu a využívat řídící příkaz continue. Když už ukončuješ program při chybě, používej funkci exit() nikoli return.

Jinak testování návratové hodnoty funkce scanf() je chybně, jak už zde bylo řečeno v předchozím příspěvku. Zápis, který máš jsem už viděl ve tvém jiném vláknu a je chybný.To co provádíš je test na 0 nikoli na počet úspěčně vrácených členů. Výraz v tvém případě se vyhodnocuje v pořadí negace následovaná rovností. Pro nerovnost se používá relační operátor !=.

Nahoru Odpovědět  +1 28. října 16:52
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Odpovídá na DarkCoder
Matúš Olejník:28. října 17:22

Presne tak už včera riešil inú vec a mal tam presne toto isté a nepoužil nič z odporúčaní, asi je zbytočné sa snažiť :)

Nahoru Odpovědět 28. října 17:22
/* I am not sure why this works but it fixes the problem */
Avatar
Kubas129
Člen
Avatar
Kubas129:28. října 17:37

aha diky
ale s tím cyklem do while, to moc nechápu, že to bych musel mít asi deklarovaný jenom jedno pole s 12 prvky
a s tím do while to myslíš nějak takto?
int =0;
do{
nacti hodnotu do pole[i]
i++;
}while(i==11)

 
Nahoru Odpovědět 28. října 17:37
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Matúš Olejník
DarkCoder:28. října 17:47

Jedna drobná odlišnost tam přeci jenom je. Ve vláknu, kde použil obdobný tvar, se "nerovnost" vztahovala k prvku pole do kterého měla být hodnota načtena. Tam to bylo úplně nesmyslné. Zde je to jiné, "nerovnost" se vztahuje k návratové hodnotě funkce scanf(), což už je správnější. To že byla použita hodnota neodpovídajícímu počtu prvků které se načítají a chybně použitý operátor nerovnosti, už je spíše drobnost daná neznalostí funkce scanf(). Zarážející ale na tom je, že když už byla testována návratová hodnota funkce scanf() na 0, muselo trknout, že se program neustále ukončuje po zadání hodnot před tím, než se načte výzva pro zadání bodu B. Ono pokud compiler vysloveně neohlásí chybu, tak to mnoho dotyčných neřeší a neuvědomující si, že něco v kódu není úplně správně. I varování je důvodem k tomu zvýšit pozornost. Na druhou stranu velice oceňuji, že dotyčný vynaložil úsilí návratovou hodnotu otestovat. Beru to rozhodně pozitivněji, i přes to, že tam byla chyba, než kdyby tak neučinil.

Nahoru Odpovědět 28. října 17:47
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Odpovídá na DarkCoder
Matúš Olejník:28. října 17:52

Máš pravdu, beriem späť :)

Nahoru Odpovědět 28. října 17:52
/* I am not sure why this works but it fixes the problem */
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Kubas129
DarkCoder:28. října 18:32

Takto:

#include <stdio.h>

#define POINTMAX 3

struct sPoint {
        double x;
        double y;
};

struct sPoint Points[POINTMAX];

int main(void) {
        int i, n;

        printf("Zadani souradnic vsech bodu\n\n");
        for (i = 0; i < POINTMAX; i++) {
                do {
                        printf("Zadej souradnici [X,Y] %d. bodu: ", i + 1);
                        n = scanf("%lf %lf", &Points[i].x, &Points[i].y);
                        fseek(stdin, 0L, SEEK_END);
                        if (n != 2) {
                                printf("Chybna souradnice. Zadejte souradnici znovu.\n\n");
                                continue;
                        }
                } while (n != 2);
        }

        printf("\nVypis souradnic vsech bodu\n\n");
        for (i = 0; i < POINTMAX; i++) {
                printf("%d. bod: [%.2f, %.2f]\n", i+1, Points[i].x, Points[i].y);
        }

        return 0;
}
Nahoru Odpovědět 28. října 18:32
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.