Nacitanie znakov – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Nacitanie znakov – C / C++ – Fórum – Programujte.comNacitanie znakov – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
kiklop
~ Anonymní uživatel
12 příspěvků
1. 1. 2012   #1
-
0
-

Zdravim, mame kod 

#include <stdio.h>

#define VALUE 7

int main()
{
    int i = 0;
    char znaky[VALUE];

    while ((znaky[i] = getchar()) && (znaky[i] != '*') && (i < VALUE))
    {
        if (znaky[i] == '\n')
            getchar();
        i++;
    }

    for (int j = 0; j < i; j++)
        printf("%c", znaky[j]);

    return 0;
}

Cecko sa moc dlho neucim ... Proste som sa to snazil naprogramovat tak aby to nacilo 7 znakov pricom ked sa nacita znak '*' tak sa nacitavanie skonci avsak nejak mi to nefunguje :(  To if (znaky[i] == '\n') som sa znazil vyriesil situaciu ze ked sa nacita znak noveho riadku aby neostal na stupnej fronte a aby sa nezapisal do toho pola znaky. Moze mi prosim niekto vysvetlit kde robim chybu a ako to vyriesit ? Dakujem za pripadne odpovede .

Nahlásit jako SPAM
IP: 178.40.94.–
Reklama
Reklama
kiklop
~ Anonymní uživatel
12 příspěvků
1. 1. 2012   #2
-
0
-

este jeden taky problemik, 

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

#define VALUE 8

int main()
{

    char znaky[VALUE];

    fgets(znaky, 8, stdin);

    for (int i = 0; i < strlen(znaky); i++)
        if ((isalpha(znaky[i])))
            {
                puts("Zadali ste nejaky neabecedny znak !");

                return 1;
            }

    return 0;
}

nacitam si 8 znakov a kontrolujem znak po znaku ci sa jedna o abecedny znak , avsak zas to furt hadze blbosti ... Kde robim chybu ? :((((

Nahlásit jako SPAM
IP: 178.40.94.–
KIIV+42
God of flame
1. 1. 2012   #3
-
0
-

V prvnim postu:

(znaky[i] = getchar()) by se melo idealne necemu rovnat... EOF neni '\0'

a pak samozrejme, kdyz uz se chces zbavit '\n' tak se zbav toho znaku '\n' ne toho co je az za nim... (jak to delas ted)

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV+42
God of flame
1. 1. 2012   #4
-
0
-

ve druhem vyhodis ze nebylo zadany pismeno kdyz bylo zadany pismeno... 

jo nauc se nepouzivat formulaci "furt to haze nejaky blbosti" ==== "auto mi nejak nejede"  cim to je? je obmotany kolem stromu? nebo jen vybita baterka?...  vesteni z kristalovy koule

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
kiklop
~ Anonymní uživatel
12 příspěvků
1. 1. 2012   #5
-
0
-

aha Dik, takze ak som to dobre pochopil tak v tom druhom pripade staci negovat tu podmienku , konkretne "if ((!isalpha(znaky[i])))" avsak problem je ze aj ked to negujem tak mi to furt nevyhodnoti spravne ked zadam menej znakov ako maximalny mozny pocet, zadam napriklad len  'a' a hned sa to vyhodnoti ze to nieje abecedny znak, nechapem preco ...

K tomu prvemu prikladu stim si uz vazne neviem rady, mal by som to kontrolovat na ten '\n' nejak takto ? "'\n' == getchar()" a potom to dalsie getchar() vynechat ?

Nahlásit jako SPAM
IP: 178.40.94.–
KIIV+42
God of flame
1. 1. 2012   #6
-
0
-

#5 kiklop
k tomu prvnimu je vic reseni.. nejlepsi je v tom pripade nezvetsit index pole... tudiz dalsi znak se zapise zase na stejne misto jako bylo '\n' (akorat budes mit problemy s \r anebo \r\n)

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
kiklop
~ Anonymní uživatel
12 příspěvků
1. 1. 2012   #7
-
0
-

tak teraz som uz z toho vazne jelen :D Nemohol by si mi to Prosimta nejak nazorne ukazat jak to myslis  aby som to aj ja bezny smrtelnik pochopil ? Tym index pole  myslis tu premennu i ?

Nahlásit jako SPAM
IP: 178.40.94.–
KIIV+42
God of flame
1. 1. 2012   #8
-
0
-

#7 kiklop
ano

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
kiklop
~ Anonymní uživatel
12 příspěvků
1. 1. 2012   #9
-
0
-

je mi akoze celkom uz asi jasne ze problem je v tej podmienke if (znaky[i] == '\n')  pretoze ten potencialne  '\n' je v stupnej fronte ale nie este v tom poli, alebo sa mylim  ? Ked ano jak by som vedel testovat co je v tej stupnej fronte ? (getchar() == '\n') ?

Nahlásit jako SPAM
IP: 178.40.94.–
kiklop
~ Anonymní uživatel
12 příspěvků
1. 1. 2012   #10
-
0
-

#6 KIIV
ked nezvatsim tu hodnotu premennej i tak tie dalsie znaky stratim ktore som zadal , ja proste tie znaky budem potrebovat stym ze ked to budem zadavat stylom znak enter znak enter znak enter tak ten novy riadok sa zahodi ...

Nahlásit jako SPAM
IP: 178.40.94.–
KIIV+42
God of flame
1. 1. 2012   #11
-
0
-

si neuvedomujes co je vstupni fronta a co je pole

to kam ukladas to je pole znaky

vstupni frontu ovladas pres getchar a POKAZDY kdyz to pouzijes, odebere se z ni jeden znak... kdyz udelas getchar() == '\n'  a nebude to  \n  - co se podle tebe stane? 

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
kiklop
~ Anonymní uživatel
12 příspěvků
1. 1. 2012   #12
-
0
-

Podla mna sa ten znak co tam bol strati , preto by ma zaujimalo jak tie sa zbavit toho noveho riadku ak tam je ... Nic ma ale nenapada :(

Nahlásit jako SPAM
IP: 178.40.94.–
kiklop
~ Anonymní uživatel
12 příspěvků
1. 1. 2012   #13
-
0
-

jedine co ma napada je pouzit nejaku funkciu ktora ignoruje biele znaky ? (scanf ?) Alebo to ide nejak spravit aj stym getcharom  ?

Nahlásit jako SPAM
IP: 178.40.94.–
kiklop
~ Anonymní uživatel
12 příspěvků
1. 1. 2012   #14
-
0
-

tak ten prvy som uz vyriesil nejak takto

  while ((pole[i] = getchar()) && (i < 7))
    {
        if ((pole[i] == '\n') || pole[i] == ' ')
            continue;
        else if (pole[i] == '*')
            break;

        i++;
    }
Nahlásit jako SPAM
IP: 178.40.94.–
kiklop
~ Anonymní uživatel
12 příspěvků
1. 1. 2012   #15
-
0
-

zaujimalo by ma este , spravil som nieco taketo

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

#define MIN 4
#define MAX 7

int main()
{
    char pole[MAX];
    int x = 0;

    while ((pole[x] = getchar()) && (x < MAX))
    {
        if ((pole[x] == '\n') || pole[x] == ' ')
            continue;
        else if (pole[x] == '*')
        {
            break;
        }


        x++;
    }

    if (x < MIN)
    {
        puts("Nedodrzanzy minimalny pocet znakov");
        return 1;
    }

    printf("\n%d", x);

    for (int i = 0; i < (strlen(pole) - 1) ; i++)
    {
        for (int j = i + 1; j < strlen(pole) ; j++)
        {
            if (pole[i] == pole[j])
            {
                puts("\nZnaky niesu unikatne !");

                return 1;
            }
        }

    }

    return 0;
}

a dam vstup trebars "qweasdyxc" tak preco u mna premenna x obsahuje hodnotu 120 miesto 7 ?

Hodnoty premennej x som sledoval debuggerom v okne watches , a paradoxne ma ku koncu hodnotu 7 ale akonahle program vyskoci z toho cyklu while sa jej hodnota prepise na 120 , preco ?

Nahlásit jako SPAM
IP: 178.40.94.–
KIIV+42
God of flame
1. 1. 2012   #16
-
0
-

prepisujes pamet za tim polem.. a cirou shodou nahod je x v pameti za polem... (+ je to little endian system takze prepisujes nejmene platny byte znakem 'x' ==> 120)

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
kiklop
~ Anonymní uživatel
12 příspěvků
1. 1. 2012   #17
-
0
-

aha takze potrebujem druhy pocitac :D Ale ne teraz vazne, vsak su tam nastavene medze , tak jak mozem prepisovat pamat za polom ?  Asi to robi posledny enter (znak nove riadku) ? Jak by sa to dalo osetrit ?

Nahlásit jako SPAM
IP: 178.40.94.–
KIIV+42
God of flame
1. 1. 2012   #18
-
0
-

jak?     (pole[x] = getchar()) && (x < MAX)

zkus to v hlave prochazet co se to stane kdyz budes mit x=7 (coz uz je za koncem pole)

(+ to mimochodem nemuzes vypsat - nema to zadny konec - tj. '\0')

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
kiklop
~ Anonymní uživatel
12 příspěvků
1. 1. 2012   #19
-
0
-

aha takze teoreticky to staci prepisat na while (((x < MAX)) && (pole[x] = getchar())) aby sa najprv vyhodnotilo to x < MAX ?

Nahlásit jako SPAM
IP: 178.40.94.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 75 hostů

Podobná vlákna

Porovnanie znakov — založil zonda

Prechadzanie znakov — založil delphak

Zámena ASCII znakov — založil nevedko01

Výskyt znakov vo vete — založil Anonym

Return znakov stringu — založil Martin

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý