#include <iostream>
#include <stdio.h>
//#include <stdbool.h>
#include <math.h>
/*
Napisz własne funkcje wypisujące i wczytujące dziesiętne liczby całkowite ze standardowego
wejścia (czytając/wypisując po znaku getchar()/putchar()). Liczba może zaczynać się od pewnej
liczby spacji po których następuje znak + lub - po którym występuje ciąg cyfr dziesiętnych, aż
do napotkania spacji.
*/
int GetDec(int *ref)
{
//zapisuje liczbe odwrotnie
int ciag[20];
//pamieta dlugosc ciagu
int i = 0;
//sprawdza czy liczba nie jest ujemna
bool ujemna = false;
//czy byl plus minus lub cyrfra
bool bylznak = false;
int x;// do czytywania znaku
while( (x = getchar()) != -1 )//dopoki wyjscie sie nie zakonczylo
{
//ok dostajemy spacje
if( x == ' ' ){
//jak cos wczesniej bylo to koniec -> wychodzimy z while
if(bylznak) break;
else {/*ignorujemy*/}
}
//ok mamy plus lub minus
else if( x == '+' || x== '-'){
//jesli jest pierwszy plus lub minus
if(!bylznak){
bylznak = true;
if(x == '-')ujemna = true;
}
//error -> dawaj od nowa
else return GetDec(ref);
}
else if( x >= '0' && x <= '9'){
//jesli dodatnia bez znaku
if(!bylznak) bylznak = true;
//dodajemy cyfre i zwieszamy dlugosc ciagu
ciag[i] = x;
i++;
}
else{
if(x == '\n' ){
//if(bylznak) break;
//else return 1;
}
//w naszej liczbie jest jakis syf
if(bylznak) return GetDec(ref);
else {/*ignoruj*/}
}
}
//----------------------------------------------
if( i > 0 ) i--; //dekrementujemy wskaznik
//teraz odwracamy
int liczba = 0;
int pot = 0;
//od konca cyfry mnozymy przez rosnace potegi dziesiatek tj 1,10,100 itd.
while(i >= 0){
double dz = 10;
int d = (ciag[i] - 48) * (int)pow(dz, pot);
liczba += d;
pot++;
i--;
}
if(ujemna) liczba = -liczba;
//ustawiamy liczbe
*ref = liczba;
if(x == -1 ){ printf("Jest EOF"); return 1;}
return 0;
}
void PutDec(int w)
{//tu jest wszystko git majonez
int x;
if(w < 0) { putchar('-'); x = -w; }
else x = w;
//jeszcze tylko szegolny przypadek od algorytmu
if( x == 0) { putchar('0'); return; }
//teraz zamiana z modulo i dzieleniem calkowitym potem obrocenie ciagu w dobra kolejnosc
int ciag[20];
int i = 0;
while(x > 0){
int l = x % 10;
x /= 10;
ciag[i] = l;;
i++;
}
while(i--){
putchar(ciag[i]+48); // +48 == +'0'
}
}
int main(void)
{
int l = 55;
while( 1 )
{
if ( GetDec( &l ) != 1){
PutDec(l);
putchar('\n');
}
else break;
if(l == 0) break;
}
system("pause");
}
No więc mam taki kod i interesuje mnie czemu dla takiego przypadku:
np. "10 -5 123 [ctrl+z][enter]" wypisuje mi liczby po kolei 10 -5 123 ale nie wykrywa [ctrl+z] czyli EOF (moge dalej cos upychac do strumienia), chodzi o funkcje GetDec(). A jak już wpisze samo "[ctrl+z][enter]" to EOF zostaje wykryty. Nie mam pojęcia co może być nie tak, bo zakladajac ze na wejsciu jest EOF to:
int GetDec(int *ref)
{
//zapisuje liczbe odwrotnie
int ciag[20];
//pamieta dlugosc ciagu
int i = 0;
//sprawdza czy liczba nie jest ujemna
bool ujemna = false;
//czy byl plus minus lub cyrfra
bool bylznak = false;
int x;// do czytywania znaku
<del> while( (x = getchar()) != -1 )//dopoki wyjscie sie nie zakonczylo
{
//ok dostajemy spacje
if( x == ' ' ){
//jak cos wczesniej bylo to koniec -> wychodzimy z while
if(bylznak) break;
else {/*ignorujemy*/}
}
//ok mamy plus lub minus
else if( x == '+' || x== '-'){
//jesli jest pierwszy plus lub minus
if(!bylznak){
bylznak = true;
if(x == '-')ujemna = true;
}
//error -> dawaj od nowa
else return GetDec(ref);
}
else if( x >= '0' && x <= '9'){
//jesli dodatnia bez znaku
if(!bylznak) bylznak = true;
//dodajemy cyfre i zwieszamy dlugosc ciagu
ciag[i] = x;
i++;
}
else{
if(x == '\n' ){
//if(bylznak) break;
//else return 1;
}
//w naszej liczbie jest jakis syf
if(bylznak) return GetDec(ref);
else {/*ignoruj*/}
}
}</del>
//----------------------------------------------
if( i > 0 ) i--; //dekrementujemy wskaznik
//teraz odwracamy
int liczba = 0;
int pot = 0;
//od konca cyfry mnozymy przez rosnace potegi dziesiatek tj 1,10,100 itd.
while(i >= 0){
double dz = 10;
int d = (ciag[i] - 48) * (int)pow(dz, pot);
liczba += d;
pot++;
i--;
}
if(ujemna) liczba = -liczba;
//ustawiamy liczbe
*ref = liczba;
if(x == -1 ){ printf("Jest EOF"); return 1;}
return 0;
}
Czyli gdy dostanie EOF na wejsciu nie powinno w ogole wejsc do petli reszta jest nie istotna i w koncu dochodzi do if(x == -1 ){ printf("Jest EOF"); return 1;}
i powinno wywalic w mainie 1 i wyjsc z while(1). Ale tak sie nie dzieje w tym pierwszym przypadku co podalem. W tym drugim już jednak tak.