int x; char c,*z,*retazec; scanf("%d",&x); //1 while( (c = getchar()) != '\n' ) //2 { strcat(retazec,z); }
Problem: program berie iba prvy input. K druhemu ma nepusti. Predpokladam, ze ked som potvrdil prvy input enterom, co je klavesa ukoncujuca nasledujuci cyklus, program to berie ako aj ukoncenie while-loopu. Aj ked neviem kvoli comu? = prva otazka.
Ako vycistim vstup pred zaciatkom loopu?
Dakujem.
PS: Ked to prehodim, tak to funguje, no take riesenie ma nezaujima.
int x; char c,*z,*retazec; while( (c = getchar()) != '\n' ) //1 { strcat(retazec,z); } scanf("%d",&x); //2
je to jednoduche. ty ked cakas na vstup od uzivatela a zadas na klavesnici napr. 2<ENTER>, tak je v stdin ulozene to cislo 2 a ten enter, cize vlastne '\n'.
cislo sa ti ulozi do premennej x. potom je tam ten getchar(). ten sa pozrie na stdin a zisti, ze tam nieco je (to je ten enter), takze sa netreba pytat nic uzivatela. kedze '\n' == '\n', tak cyklus okamzite skonci, nevykona sa ani raz.
vstup vycistis napr. takto:
while ((c = getchar()) != '\n' && c != EOF);
btw. premenna 'retazec' nema alokovane ziadne miesto
.. alokovane to mam, len som zmazal cast kodu, aby nebol zbytocne bordel :)
Moment. Toto riesenie nefunguje. Mozes to prosim skusit vycistit na tomto konkretnom priklade?
#include <stdio.h>
int main(){
char c;
c = getchar();
printf("1 vstup\n");
while ((c=getchar())!='\n' && c!=EOF);
while ((c=getchar())!='\n' && c!=EOF)
{
printf("\n2 vstup\n");
}
return 1;
}
Funkcia getchar() je na vstup jedného znaku a jej použitie je v tomto prípade nelogické.
Na vyčistenie vstupu sa používa konštrukcia
while(getchar() != '\n')
;
Pouzitie getchar() vs fgets() je otazkou niekde inde. Zalezi, co chce programator urobit. Naviac toto bol len vysek programu s problemom, ktory zakladatel temy riesil.
Riesenie, ktore bolo vyssie poukazane je lepsie, nakolko zohladnuje aj EOF.
Ako sa pri zadávaní znakov z klávesnice objaví EOF?
./program < vstup
vstup
je predpokladám nejaký vstupný súbor.Ale moja otázka sa týkala len čisto reálneho vstupu klávesnice, kedy chcem vyčistiť všetky zadané znaky po stlačenie <enter>, kvôli novému zadávaniu.
Tam mi testovanie na EOF pripadá zbytočné.
Usetrit cca 10 znakov v zdrojovom kode kvoli lenivosti a "snad to nejak pojde" sa obvykle nevyplaca. Skus si pozriet ako su pisane unixove nastroje. Povodna myslienka Unixu (ta myslienka existovala skor btw) bola, ze vsetko je subor a vstup z klavesnice je svojim sposobom taktiez subor. Ak programujes v C urcite vies, ze stdin je FILE *:
priklad suboru (chcem nacitat udaj1): Riesim to takto:
Da sa to riesit jednoduchsie? Resp. pomozete mi v tom vychytat muchy ak tam nejake su?
velkost - 2
, aby mi ostalo miesto na posledný'\0'
.2. Ta praca so strcat() radsej nie.