NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Problém s načítaním znakov do poľa

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

Aktivity
Avatar
oliver.olejnik:17.11.2017 19:00

Čaute, viete mi poradiť, ako mám správne načítať hodnoty do poľa "input"? Načítavanie sa ukončí vtedy, ak pri čítaní vstupu program narazí na hodnotu 0 alebo dôjde k ukončeniu štandardného vstupu (načíta sa hodnota EOF napr. stlačením klávesovej skratky Ctrl+d). Pole je typu float. Díky moc!

float input[500];
float number;

while(scanf("%f", &number) == 1){
            if(number != 0 && number != '\n' && number != EOF){
                i++;
                input[i] = number;
            }
            else {
                break;
            }
}
 
Odpovědět
17.11.2017 19:00
Avatar
Odpovídá na oliver.olejnik
Libor Šimo (libcosenior):17.11.2017 20:13

Ukončíš to číslicou 0 alebo akoukoľvek nečíselnou hodnotou.

#include <stdio.h>

int main(void)
{
    float input[500];
    float number;
    int i;

    while(scanf("%f", &number) == 1){
        if(number != 0){
            input[i++] = number;
        }
        else {
            break;
        }
    }

    return 0;
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
17.11.2017 20:13
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na oliver.olejnik
Matúš Olejník:17.11.2017 21:28

Vidím, že podľa podmienky chceš ukončiť načítavanie aj ak sa zadá len prázdny riadok, scanf však biele znaky ignoruje preto to môžeš spraviť napr. takto: pomocou fgets si načítaš vstup ako string do buffera, následne skontroluješ či sa nenačítal len prázdny riadok, ak nie pomocou sscanf si načítaš formátovaný vstup do pomocnej premennej number a ak sa do nej načítalo naozaj číslo tak už len skontroluješ či to nie je 0.

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

int main(){
    float input[500];
    float number;
    int i = 0;
    char buffer[100];

    while (fgets(buffer, sizeof(buffer), stdin) != NULL) {
        if (strcmp(buffer, "\n") != 0 && sscanf(buffer, "%f", &number) == 1) {
            if (number != 0) {
                input[i++] = number;
            }
            else
                break;
        }
        else
            break;
    }

    return 0;
}
Editováno 17.11.2017 21:30
Nahoru Odpovědět
17.11.2017 21:28
/* I am not sure why this works but it fixes the problem */
Avatar
DarkCoder
Člen
Avatar
Odpovídá na oliver.olejnik
DarkCoder:18.11.2017 2:47
do {
        if ((scanf("%f", &number) != 1) || (!number)) break;
        else input[i++] = number;
} while (i < 500);
Nahoru Odpovědět
18.11.2017 2:47
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
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 4 zpráv z 4.