Portál AbcLinuxu, 12. května 2025 05:16
1)Vstup je jasně daný: a oper b
, kde a
a b
jsou typu double
, oper
je +,-,* nebo /
Přičemž program ignoruje mezery mezi jednotlivými vstupy - příklad:
3 + 1
program interpretuje jako 3+1 nehledě na to že uživatel zadal mnoho mezer mezi jednotlivými vstupy
2) Pokud uživatel zadá nějaký nesmysl - například 4
nebo 3a
a zmáčkne ENTER
tak se objeví chybová hláška
Takto vypadá můj současný kód:
int main()
{
char oper;
double a, b;
printf("Napiste co chcete vypocitat\n");
scanf("%lf", &a);
getchar();
oper = getchar();
scanf("%lf", &b);
switch(oper)
{
case '+':
printf("%f+%f=%.2f",a,b,a+b);
break;
case '-':
printf("%f-%f=%.2f",a,b,a-b);
break;
case '*':
printf("%f*%f=%.2f",a,b,a*b);
break;
case '/':
if(b != 0)
{
printf("%f/%f=%.2f",a,b,a/b);
break;
}
else
{
printf("Error! Delite nulou.");
break;
}
default:
printf("Error! Spatne zadany operator.");
break;
}
return 0;
}
Řešení dotazu:
char oper[2] = {0, 0}; double a, b; if (3 == scanf("%lf %1[+/*-] %lf", &a, &oper, &b)) { printf("%f %c %f = %.2f\n", a, oper[0], b, a + b); } else { fprintf(stderr, "Nejaka blbost.\n"); }
double a, b; char op; if (scanf("%lf %1[-+/*] %lf", &a, &op, &b) != 3) printf("Error.\n"); else { /* ... */ }
scanf() je mnohem inteligentnější, než se obecně ví...Ještě ho naučit, že tečka i čárka u plavacích čísel totéž je (ehm tedy desetinný oddělovač, bez ohledu na locale) a bylo by vystarané...
394
a zmáčknu ENTER
tak se mi ta hláška ERROR nechce zobrazit, zatímco pokud zadám 3 56
nebo CauLidi
tak se hláška ERROR zobrazí. Nevíte v čem je problém?
int main()
{
char oper;
double a, b;
char buffer[256];
printf("Napiste co chcete vypocitat\n");
fgets(buffer, 256, stdin);
if (sscanf("%lf %1[-+/*] %lf", &a, &oper, &b) != 3)
printf("ERROR.\n");
else
{ .... zbytek kódu je stejný....
Problémem ale teď je že pokud zadám normální vstup
3 + 1
tak to zmrzne jako předtím.
Ovšem když zadám
3458
tak se doopravdy objeví ERROR
Mohli byste mi to prosím vysvětlit a opravit?
scanf("%lf%*[ \t]%1[+/*-]%*[ \t]%lf", &a, &oper, &b)Ale jinak se mi taktéž osvědčilo nejdříve načíst řádek a pak teprve ho parsovat. Pokud konec řádku nese význam, je to spolehlivější a lépe to reaguje na chyby ve vstupu.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.