

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;
}
jezisikriste to vas ucia na skolach to dementne kolko krat alokoval a namietso indexu pouzivat hviezdicka plus minus? To sa neda citat (a potom to aj patricne (ne)funguje ptz to neni schopny citat ani autor :).
Neostava ti nahodou na vstupe znak '\r' po zmacknuti enteru?
Preco nepouzijes debugger?
P.S: a neuvolnujes alokovanu pamat (to sice neni tvoj problem, ale je to vazny nedostatok toho zlepenca)
A co je zle s tym kolkokratalokoval?? Lebo to dynamicke nacitavanie prvkov do pola je dobre tam nieje chyba.
\r sa vzal odkial? S debuggerom este narabat neviem
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
To
while(getchar()!='\n');
musis vyhodit uplne prec. Nemozes to za nic nahradit.
Vybrat neplatne znaky musis po tom velkom cykle (ptz vtedy este vies ze co bol posledny nacitany znak), das si tam if(znak!='\n') while(getchar()!='\n');
Dakujem uz mi to ide :)