IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: řádky v C

Aktivity
Avatar
dirtyjobs
Člen
Avatar
dirtyjobs:27.1.2015 11:17

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):27.1.2015 12:59

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):27.1.2015 13:09

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):27.1.2015 13:30

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:27.1.2015 13:39

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
Odpovídá na dirtyjobs
Libor Šimo (libcosenior):27.1.2015 13:41

Vlož sem celý kód.

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:27.1.2015 13:49

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:27.1.2015 13:51

z=getchar != EOF

něco mi to vynechalo

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

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):27.1.2015 14:10

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:27.1.2015 14:17

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):27.1.2015 14:41

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):27.1.2015 14:52

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í
+2,50 Kč
Ř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:27.1.2015 17:04

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.