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;
}
Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
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
A dvakrat na enter musis cakat preto lebo v tom while si uz raz vybral '\n' zo vstupu, a pri dalsom… nový
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… nový
Parker 20.03.2014 22:48
Parker
To while(getchar()!='\n'); musis vyhodit uplne prec. Nemozes to za nic nahradit. Vybrat neplatne zn… nový
MM.. 20.03.2014 22:59
MM..
Dakujem uz mi to ide :) poslední
Parker 21.03.2014 06:40
Parker

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