Avatar
dirtyjobs
Člen
Avatar
dirtyjobs:

Zdravím, nevíte proč se příkaz getchar v cyklu zastavuje na konci prvního řádku a dále už nepokračuje?

 
Odpovědět 27.1.2015 11:17
Avatar
Odpovídá na dirtyjobs
Libor Šimo (libcosenior):

Pretože ďaší cyklus berie ako vstup znak '\n' (enter).

Editováno 27.1.2015 13:01
Nahoru Odpovědět 27.1.2015 12:59
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):

Nedá sa mi prodať obrázok, tak to sem napíšem:

#include <stdio.h>

int main(void)
{
    int i;
    char c;

    for (i = 0; i < 10; i++) {
        printf("%d - ", i + 1);
        c = getchar();
    }

    return 0;
}

Výpis:
1 - a
2 - 3 - s
4 - 5 - d
6 - 7 - f
8 - 9 - g
10 -

Zamysli sa nad tým, že getchar() zoberie len jeden znak, ďalší je enter, ktorým ho potvrdíš.

Riešenie je napr.:

#include <stdio.h>

int main(void)
{
    int i;
    char c;

    for (i = 0; i < 10; i++) {
        printf("%d - ", i + 1);
        c = getchar();
        while (getchar() != '\n') ; // zbavenie sa znaku enter
    }

    return 0;
}

Výpis:
1 - a
2 - s
3 - d
4 - f
5 - g
6 - h
7 - j
8 - k
9 - l
10 - m

Editováno 27.1.2015 13:12
Nahoru Odpovědět 27.1.2015 13:09
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Libor Šimo (libcosenior):

Alebo

#include <stdio.h>

int main(void)
{
    int i, c; // znak sa musí deklarovať ako číslo, nie ako char
    //char c;

    for (i = 0; i < 10; i++) {
        printf("%d - ", i + 1);
        scanf(" %c", c); // medzera pred %c zoberie znak enter
    }

    return 0;
}
Nahoru Odpovědět 27.1.2015 13:30
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
dirtyjobs
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
dirtyjobs:

Já jsem to chtěl udělat tak, že vstup je dlouhý text, který se nevleze na jeden řádek, tak pokračuje i na druhý řádek a program má jenom zkopírovat vstup na výstup, ale pomocí příkazů getchar, putchar zkopíruje jen jeden řádek.

 
Nahoru Odpovědět 27.1.2015 13:39
Avatar
Nahoru Odpovědět 27.1.2015 13:41
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
dirtyjobs
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
dirtyjobs:

ještě jinak...program na počítání řádků:

main()
{
int z, pr;

pr=1;
while!=EOF)
{
if (z=='\n')
{
++pr;
}
printf("%d\n", pr);
}
}

vypíše samé jedničky a jen jednu dvojku i když je na druhém řádku více znaků

 
Nahoru Odpovědět 27.1.2015 13:49
Avatar
dirtyjobs
Člen
Avatar
Odpovídá na dirtyjobs
dirtyjobs:

z=getchar != EOF

něco mi to vynechalo

 
Nahoru Odpovědět 27.1.2015 13:51
Avatar
Libor Šimo (libcosenior):

A čo takto?

#include <stdio.h>

int main(void)
{

    int pr;
    char z;

    pr = 0;
    while(z = getchar()) {
        if (z == '\n') {
            pr++;
            printf("%d\n", pr);
        }
        if (pr == 5)
            break;
    }

    return 0;
}
Nahoru Odpovědět 27.1.2015 14:05
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na dirtyjobs
Libor Šimo (libcosenior):

Mám ale pocit, že chceš čítať zo súboru a nie zo vstupu z klávesnice.

Nahoru Odpovědět 27.1.2015 14:10
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
dirtyjobs
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
dirtyjobs:

Ten program byl k tomu asi původně určený, ale nevím proč se getchar zastaví, "\n" je regulérní znak, neměl by zastavit cyklus.

 
Nahoru Odpovědět 27.1.2015 14:17
Avatar
Libor Šimo (libcosenior):

Tak ešte raz, getchar() berie iba jeden znak, teda keď napíšeš viac znakov do riadku, berie iba prvý znak.
Keď zadáš asdfgh\n, tak getchar() zoberie iba 'a'.
Keď zadáš a\n, tak tiež zoberie iba 'a' a znak '\n' ostane v bufferi.

Vyskúšaj si tento programík:

#include <stdio.h>

int main(void)
{
    char c;

    c = getchar();
    putchar(c);
    c = getchar();
    putchar('\n'); // novy riadok
    if (c == '\n')
        printf("Bol stlaceny enter!\n");
    else
        putchar(c);

    return 0;
}

Spusti a zadaj napr.: asdf(enter).
Spusti druhý krát a zadaj: a(enter).

Editováno 27.1.2015 14:41
Nahoru Odpovědět 27.1.2015 14:41
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na dirtyjobs
Libor Šimo (libcosenior):

Ešte jeden príklad.
V programe zadaj napr.: asdfg\n

#include <stdio.h>

int main(void)
{
    char c;

    c = getchar();
    putchar(c);
    c = getchar();
    putchar(c);
    c = getchar();
    putchar(c);
    c = getchar();
    putchar(c);
    c = getchar();
    putchar(c);

    return 0;
}
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 27.1.2015 14:52
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
dirtyjobs
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
dirtyjobs:

Díky, už jsem na to přišel, já jsem chtěl číst z klávesnice stejně jako ze souboru.:)

 
Nahoru Odpovědět 27.1.2015 17:04
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 14 zpráv z 14.