Diskuze: funkce scanf
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 14 zpráv z 14.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Pokud chceš, aby program načetl jak číslice tak i rozpoznal to co bylo zadáno, je třeba důkladné analýzy. Na to Ti samotná funkce scanf() nestačí. Nejlepším řešením je načíst vstup jako řetězec pomocí fgets() a provést důkladný rozbor celého řetězce. Na základě tohoto rozboru můžeš buďto uživatele nechat opakovat zadání vstupu, nebo být trochu benevolentní a vstup si z celého řetězce vyextrahovat. Přílišná benevolence však není úplně na místě. Funkce scanf() Ti umožňuje buďto definovat svoji znakovou sadu nebo je schopna potlačit vstup. Takže pokud chceš, aby Ti funkce načetla čísla např. z následujících vstupů? [1,2] nebo (1,2) nebo {1,2}, můžeš potlačit ty znaky, které tam nechceš mít.
scanf("%*c%d%*c%d%*c", &x, &y);
To však Ti nezaručí, že uživatel zadá vstup dle tvých představ. Pokud to chceš v tomto stavu, použij to a otestuj návratovou hodnotu funkce scanf() na počet hodnot které načítáš. Pokud To nebude sedět, opakuj zadání vstupu.
Pokud chceš provádět nějaké úpravy na vstupu, využij fgets() k načtení vstupu, proveď úpravy v poli do kterého řetězec načítáš a nakonec použij sscanf() pro načtení vstupu z řetězce. Získat hodnoty a uložit si je do proměnných můžeš samozřejmě provést i v části určené úpravám.
Že já mám za problém pořádně načíst ty vstupy po nás ve škole
požadují, aby program poznal, jestli zadáváme strany trojúhelníka, nebo
jeho body.
Problém ale je, že to program má poznat podle vstupu:
Bud můžu teda zadat body npř: {[5;2], [6;3],[7;8]} a nebo jeho strany npr:
{20,30,40}
Ale problém mám v tom, že nevím jak to mám zjistit vše najednou, že
jednotlivě by to bylo nějak takto:
pocet = (scanf("{[%lf; %lf ], [%lf;%lf], [ %lf ; %lf ] }", &a,&b,&c,&d,&e,&f));
pocet = (scanf("{%lf, %lf, %lf}", &a,&b,&c));
printf("%d", pocet);
Jen nevím jak to mám spojit
Samozřejmě že to funguje, jen je to třeba řádně opsat. Měl bys vidět, že v řídícím řetězci používám dva aktivní specifikátory formátu, tak je třeba udělat to, aby počet dalších argumentů byl roven dvěma a ne šesti. Když si vyzkoušíš následující program, přesvědčíš se. Stačí to jen zkopírovat.
#include <stdio.h>
int main(void) {
int x, y;
printf("Zadej souradnici ve tvaru [X,Y]: ");
scanf("%*c%d%*c%d%*c", &x, &y);
printf("x=%d, y=%d\n", x, y);
return 0;
}
nj to je hezký ale asi si nepochopil ten můj problém
já právě potřebuji, abych do mého programu mohl zadat tohle:
{[5;10]}
ale zároven i tohle:
{ 10 , 15 }
a to v tom tvém kodu nejde
ale díky za radu
Upřímně pochybuji, že Vás budou ve škole učit něco pokročilejšího než-li funkci scanf(). Tak to vyřeš následujícím způsobem. Zadej výzvu, dle které které má uživatel zadat vstup, něco ve smyslu následujícího:
printf("Chcete vyjádřit trojúhelník pomocí bodů nebo stran?\n");
printf("Zadejte b - pomocí bodů, s - pomocí stran\n\n");
choice = getchar();
if(choice=='b') // zde formát načtení pomocí bodů
else if(choice=='s') // zde formát načtení pomocí stran
else // zde neznámá volba
// ...
Tak ako má vyzerať korektný vstup? Stačí takto {[5;10]} resp {5,10} alebo treba vždy aby boli zadané všetky tri body/strany?
Nerobievam v C preto upozorňujem, že toto asi nie
je korektné, ale pred tým než niekto iný pomôže alebo než by som
to začal ručne parsovať
môžeš skúsiť toto
int main() {
char s[255];
double a, b, c, d, e, f;
fgets(s, 255, stdin);
if (sscanf(s, "{[%lf;%lf],[%lf;%lf],[%lf;%lf]}", &a, &b, &c, &d, &e, &f) == 6) {
printf("Zadal som body: %f %f %f %f %f %f\n", a, b, c, d, e, f);
}
if (sscanf(s, "{%lf,%lf,%lf}", &a, &b, &c) == 3) {
printf("Zadal som strany: %f %f %f\n", a, b, c);
}
getchar(); getchar();
return 0;
}
prípade môžeš použiť knižnicu regex.h?
Ako nechce sa mi v tom veľmi pokračovať pretože sa mi to nepáči, ale
ako rýchlu pomoc môžeš skúsiť takto
Ignorovať nové riadky a medzery a ukončiť čítanie ak je zadaná
}
#include <stdio.h>
#include <stdlib.h>
#define BUFF_SIZE 255
int main() {
char buffer[BUFF_SIZE];
double a, b, c, d, e, f;
int i = 0, tmp;
while (1) {
tmp = fgetc(stdin);
if (tmp == '\n' || tmp == ' ') {
continue;
}
//nech neskoncime mimo vyhradenej pamate
if (i + 2 == BUFF_SIZE) {
buffer[i + 1] = '\0';
break;
}
buffer[i] = tmp;
i++;
if (tmp == '}') {
buffer[i] = '\0';
break;
}
}
if (sscanf(buffer, "{[%lf;%lf],[%lf;%lf],[%lf;%lf]}", &a, &b, &c, &d, &e, &f) == 6) {
printf("Zadal som body: %f %f %f %f %f %f\n", a, b, c, d, e, f);
}
if (sscanf(buffer, "{%lf,%lf,%lf}", &a, &b, &c) == 3) {
printf("Zadal som strany: %f %f %f\n", a, b, c);
}
getchar(); getchar();
return 0;
}
Zobrazeno 14 zpráv z 14.