Jak mogę skorzystać z EOF w c++

0

Mam np.

char x;
while(x!=eof)x=getchar();

chciałbym tak ale kompilator zgłasza błąd.
Proszę o odpowiedź:
jak mogę to zrobić?

2
  1. Na przyszłość, pisz jaki masz błąd, żeby było łatwiej Ci pomóc — bez zgadywania.
  2. Zgaduję, że kompilator narzeka na porównanie między typami. Możesz jawnie rzutować na chara: static_cast<char>(EOF).
  3. Inną opcją jest, że kompilatorowi nie odpowiada porównanie z x, któremu nie przypisano żadnej wartości — i słusznie, może się przypadkiem tak trafić, że tam będzie od razu EOF, i Ci się pętla nie wykona. Przepisz ją na odpowiednie do {…} while {…}.
0
Althorion napisał(a):
  1. Na przyszłość, pisz jaki masz błąd, żeby było łatwiej Ci pomóc — bez zgadywania.
  2. Zgaduję, że kompilator narzeka na porównanie między typami. Możesz jawnie rzutować na chara: static_cast<char>(EOF).
  3. Inną opcją jest, że kompilatorowi nie odpowiada porównanie z x, któremu nie przypisano żadnej wartości — i słusznie, może się przypadkiem tak trafić, że tam będzie od razu EOF, i Ci się pętla nie wykona. Przepisz ją na odpowiednie do {…} while {…}.

Wypisuje: forbids comparision between pointer and integer.
poproszę o kod.

2

Czyli, po przetłumaczeniu, kompilatorowi przeszkadza porównanie między typami (wskaźnikiem i intem). Kod na tę okoliczność dostałeś w punkcie drugim. Rada z punktu trzeciego wciąż jednak ma zastosowanie.

2
gaborek1987 napisał(a):

poproszę o kod.

To chyba Ty powinieneś napisać i przedstawić kod poprawiony wg wskazówek od Althorion, skoro nadal masz problem z kompilacją. Zwyczajowo jest przyjęte, że można poprosić o wsparcie, wskazówki, dodatkowe informacje, ale nie o kompletny i działający program.

3

Zanim wejdziecie na poziom doktoratu, zacznijmy od przedszkola:

eof i EOF to zupełnie inne rzeczy.
W tytule @gaborek1987 pytasz wielki literami, w kodzie małymi. To elementarz

gaborek1987 napisał(a):

poproszę o kod.

NICZEGO, ale to NICZEGO nie osiągniesz, jeśli czasem uda ci się wyłudzić kod, którego nie rozumiesz i nawet nie podejmiesz proby zrozumienia.

Kod ma więcej błędów / miejsc czułych na Undefined Behaviour, to jednak jest C, od czasu do czasu strzał w stopę jest gwarantowany

0
AnyKtokolwiek napisał(a):

Zanim wejdziecie na poziom doktoratu, zacznijmy od przedszkola:

eof i EOF to zupełnie inne rzeczy.
W tytule @gaborek1987 pytasz wielki literami, w kodzie małymi. To elementarz

gaborek1987 napisał(a):

poproszę o kod.

NICZEGO, ale to NICZEGO nie osiągniesz, jeśli czasem uda ci się wyłudzić kod, którego nie rozumiesz i nawet nie podejmiesz proby zrozumienia.

Kod ma więcej błędów / miejsc czułych na Undefined Behaviour, to jednak jest C, od czasu do czasu strzał w stopę jest gwarantowany

int main() {
	char x;
  char a=static_cast<char>(EOF);
	x=getchar();
	while(true){
		x=getchar();
		if(x==a)break;
	}
	return 0;
}

O to krótki kod. Kompiluje się . Nie wiem czy skończy swoje działanie ten program.
Z góry dziękuję! 😀

0

Zadziała i dziękuję.

while(true){
		x=getchar();
		if(x==EOF)break;
	}
3

@gaborek1987:

Nie dziękuj.
x jest zadeklarowany źle / ryzykownie

https://cpp0x.pl/dokumentacja/standard-C/getchar/561

2

@AnyKtokolwiek ciekawy przypadek jest jeśli na stdin damy 0xff bajta, to wtedy jeśli x będzie typu char to program pomyśli, że jest EOF gdyż EOF dostanie z inta na char konwersję.
A w przypadku x jako int, poprawnie zostanie zinterpretowany bajt 0xff jako nieprintowalny znak 255.

Przykładowo jeśli damy na stdin ab\xffcd to w przypadku char x wyświetlone zostanie ab.
A w przypadku int x wyświetlone zostanie ab�cd

#include <iostream>
#include <sstream>

int main() {
    // int x = 0; // wersja poprawna
    char x = 0; // wersja błędna
    
    std::stringstream ss;
    ss << "ab";
    ss << '\xff';
    ss << "cd";
    while(true)
    {
        x = ss.get();
        if (x == EOF)
            break;
        std::cout << static_cast<char>(x);
    }
}

Typowo jak przy pisaniu exploitów, wykorzystuje się drobne błędy.

No i na https://en.cppreference.com/w/cpp/io/c/getchar
jest trochę lepsza dokumentacja ja raczej tą preferuję.
cppreference lub cplusplus

1
Autysta napisał(a):

@AnyKtokolwiek ciekawy przypadek jest jeśli na stdin damy 0xff bajta, to wtedy ...

Tak.
Z rozbiciem w jakich defaultach kompilatora, czy znak jest signed / unsigned
Twój case chyba jest na signed ???? Późna pora...

A na usigned (nawet przy braku znaku \xff ) mamy neverending story ze względu na EOF

gaborek1987 napisał(a):

char a=static_cast<char>(EOF);
x=getchar();

We mnie takie rzutowanie C++ w C (i to w najbardziej "strzelającym w stopę" wydaniu) budzi nieciekawe odruchy żołądkowe

Ale taka jest patologia i formalnej dydaktyki (większośc nauczycieli C++ jest cienka jak Polsilver) , i nieformalnej (czyli CtrC/CtrlV fragmentów C / C++ z netu). NIELICZNI wyjdą z tego odróżniając C i C++

2

Co ty właściwie chcesz zrobić? Mi to wygląda na problem XY.

getchar() jest funkcją z C, która nie powinna być używana w C++!
Zamiast używac int (jak zaproponował Autysta) można też użyć innego przeciążenia std::basic_istream<CharT,Traits>::get.

char ch;
while (std::cin.get(ch)) {
    std::cout << ch;
}
0
MarekR22 napisał(a):

Co ty właściwie chcesz zrobić? Mi to wygląda na problem XY.

getchar() jest funkcją z C, która nie powinna być używana w C++!
Zamiast używac int (jak zaproponował Autysta) można też użyć innego przeciążenia std::basic_istream<CharT,Traits>::get.

char ch;
while (std::cin.get(ch)) {
    std::cout << ch;
}

Tak na prawdę chodziło mi o wczytanie całego wejścia znak po znaku aby mniej pamięci zużyć.

1
gaborek1987 napisał(a):

Tak na prawdę chodziło mi o wczytanie całego wejścia znak po znaku aby mniej pamięci zużyć.

Typowe pomysły ludzi, którzy jeszcze się nauczyli czytać własnego kodu (i dokumentacji)

1 użytkowników online, w tym zalogowanych: 0, gości: 1