Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno C - buffer problem s nacitanim z klavesnice

Ahoj mam maly problem program facha jak ma jeho podstatou je ze uzivatel si zvoli koncove hranice cisiel potom svoje cislo zada a ak bude splnat poziadavky teda nebude presahovat hranice a nebude sa v nom nachadzat iny znak ako cislo tak sa program ukonci dovtedy ale bude furt dokola cisla zadavat. Problem je v tom ze po kazdom novom zadani znaku musi uzivatel stlacit viac enterov

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

int main()
{
    int min;
    int max;

    printf("Zadaj dolnu hranicu: ");
    scanf("%d",&min);
    printf("Zadaj hornu hranicu: ");
    scanf("%d",&max);
    printf("Poziadavka: cele cislo od %d po %d\n",min,max);
    while(getInt(min,max)==0);
    return 0;
}

int getInt(int min,int max)
{
    const int POCET=10;
    int kolkoKratAlokoval=1;
    int pocetPrvkov=0;
    int cislo;
    char znak;
    char *chybnyZnak;
    char *cisla=(char *)malloc(POCET*sizeof(char));

    printf("Vstup: ");
    while(getchar()!='\n');
    while((znak=getc(stdin))!='\n')
    {
        ++pocetPrvkov;
        if(pocetPrvkov%POCET==(POCET-1))
        {
            ++kolkoKratAlokoval;
            if((cisla=(char *)realloc(cisla,POCET*kolkoKratAlokoval*sizeof(cha r)))==NULL)
            {
                printf("Chyba realokacie");
                return 1;
            }
        }
        *(cisla+pocetPrvkov-1)=znak;
    }
    *(cisla+pocetPrvkov)='\0';
    cislo=strtol(cisla,&chybnyZnak,10);
    if(*chybnyZnak!='\0')
    {
        printf("Vystup: Zadane cislo obsahuje nepovoleny znak \"%c\". Zadaj cislo znovu!\n",*chybnyZnak);

        if(cislo<min && cislo>max)
        {
            printf("Vystup: Zadane cislo je mimo povoleneho rozsahu. Zadaj cislo znovu!\n");
        }
        return 0;
    }

    if(*chybnyZnak=='\0')
    {
        if(cislo>=min && cislo<=max)
        {
            return 1;
        }

        else
        {
            printf("Vystup: Zadane cislo je mimo povoleneho rozsahu. Zadaj cislo znovu!\n");
            return 0;
        }
    }
    return 0;
}
Předmět Autor Datum
vlastne uz aj ked zadam spravne cislo to blbne
Parker 20.03.2014 19:12
Parker
jezisikriste to vas ucia na skolach to dementne kolko krat alokoval a namietso indexu pouzivat hviez…
MM.. 20.03.2014 19:41
MM..
Neostava ti nahodou na vstupe znak '\r' po zmacknuti enteru? Preco nepouzijes debugger? P.S: a neuv…
MM.. 20.03.2014 19:50
MM..
A co je zle s tym kolkokratalokoval?? Lebo to dynamicke nacitavanie prvkov do pola je dobre tam niej…
Parker 20.03.2014 20:21
Parker
Novy riadok vo Windows je \r\n Tak sa s debuggerom narabat nauc, zas az take tazke to neni kliknut…
MM.. 20.03.2014 22:03
MM..
Tusim ale ze getc(stdin) nevracia \r, pretoze stdin je "otvorena" v textovom mode. Potom tam mas chy…
MM.. 20.03.2014 22:09
MM..
A dvakrat na enter musis cakat preto lebo v tom while si uz raz vybral '\n' zo vstupu, a pri dalsom…
MM.. 20.03.2014 22:11
MM..
To dynamicke citanie prvkov tak mat musim lebo to tak je zadane :D vymenil som ten riadok while ( ge…
Parker 20.03.2014 22:48
Parker
To while(getchar()!='\n'); musis vyhodit uplne prec. Nemozes to za nic nahradit. Vybrat neplatne zn…
MM.. 20.03.2014 22:59
MM..
Dakujem uz mi to ide :) poslední
Parker 21.03.2014 06:40
Parker

Novy riadok vo Windows je \r\n

Tak sa s debuggerom narabat nauc, zas az take tazke to neni kliknut na "start debugging" v menu :)

Dynamicke nacitavanie prvkov je dobra vec ale nie tak jak to robis (nemas tam osetreny malloc, nerobis free, neda sa to citat, az budes mat 10x zlozity kod tak sa z tych premennych zosalis, a to co si urobil sa da napisat na 5 riadkov namiesto 50riadkov). Uz som tu pred par tyzdnami bud tebe alebo niekomu s podobne uchylnym kolkoKratAlokoval pisal jak sa to robi jednoduchsie a citatelne, aj s prikladom.

Tusim ale ze getc(stdin) nevracia \r, pretoze stdin je "otvorena" v textovom mode. Potom tam mas chybu inde, ktoru je tazke najst ptz ten kod je totalne necitatelne napisany. V slusnom kode najdes chybu okamzite. Aspon keby si napisal ze co presne blbne tak by sa dalo dedukovat kde je chyba. Nazhav debugger a odkrokuj si to.

A dvakrat na enter musis cakat preto lebo v tom while si uz raz vybral '\n' zo vstupu, a pri dalsom volani funkcie cakas na dalsie '\n' v cykle s tym getchar. getchar nemoze vybrat uz vybraty znak, caka na dalsi. getchar je uplne stejna vec jak getc(stdin)

P.S> to ze cela ta funkcia je nezmysel radsej ani nepisem. Len v kratkosti - ked chces precitat ccely riadok az po enter tak sa to nerobi po znakoch s getch, ale mozes pouzit fgets() (ne gets ptz gets nedovoluje poslat velkost buffra), alebo getline()

To dynamicke citanie prvkov tak mat musim lebo to tak je zadane :D vymenil som ten riadok while ( getchar() != '\n' ); za getc(stdin); uz mi to pekne pise hned za sebou v enteroch. Chyba je uz iba v tom ze ked zadam cislo ktore nieje v intervale <10,20> napr. 23 tak mi napise ze to cislo tam nepatri zadaj znovu ked dam uz 12 tak mi to pise furt ze nepatri co je divne, ked dam hned prve 12 tak napise cislo je ok to zacne blbnut po tom opakovani. Ale dakujem za radu pomohol si mi sa prepracovat uz dalej :) ja sa na to kuknem kedtak zajtra a urcite tam tu chybu najdem

Zpět do poradny Odpovědět na původní otázku Nahoru