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ć?
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ć?
char
a: static_cast<char>(EOF)
.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 {…}
.Althorion napisał(a):
- Na przyszłość, pisz jaki masz błąd, żeby było łatwiej Ci pomóc — bez zgadywania.
- Zgaduję, że kompilator narzeka na porównanie między typami. Możesz jawnie rzutować na
char
a:static_cast<char>(EOF)
.- 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 razuEOF
, i Ci się pętla nie wykona. Przepisz ją na odpowiedniedo {…} while {…}
.
Wypisuje: forbids comparision between pointer and integer.
poproszę o kod.
Czyli, po przetłumaczeniu, kompilatorowi przeszkadza porównanie między typami (wskaźnikiem i int
em). Kod na tę okoliczność dostałeś w punkcie drugim. Rada z punktu trzeciego wciąż jednak ma zastosowanie.
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.
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
AnyKtokolwiek napisał(a):
Zanim wejdziecie na poziom doktoratu, zacznijmy od przedszkola:
eof
iEOF
to zupełnie inne rzeczy.
W tytule @gaborek1987 pytasz wielki literami, w kodzie małymi. To elementarzgaborek1987 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ę!
Zadziała i dziękuję.
while(true){
x=getchar();
if(x==EOF)break;
}
Nie dziękuj.
x jest zadeklarowany źle / ryzykownie
@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
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++
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;
}
MarekR22 napisał(a):
Co ty właściwie chcesz zrobić? Mi to wygląda na problem XY.
getchar()
jest funkcją zC
, która nie powinna być używana w C++!
Zamiast używacint
(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ć.
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)