我如何在 EOF 后停止读取值
How i can stop reading values after EOF
我的代码没有什么问题。我尝试制作 'while' 循环,它将读取我所有的输入值,然后在我单击 EOF 时停止。我读到 windows 中的 EOF 是 CTRL+Z 等等,但我的 'while' 不想停止,在所有输入值和 CTRL+Z 之后,它会停留并等待下一个值。
这是我的代码,希望你能帮助我谢谢):
#include <stdio.h>
#include <stdbool.h>
#define gc getchar
inline int scan_integer();
inline void zaprzeczenie(bool*);
int main() {
bool rosnie=true;
int poprzednia;
register int terazniejsza;
terazniejsza = scan_integer();
poprzednia = terazniejsza;
int sumaAktualnego=terazniejsza;
int sumaNajwiekszego=terazniejsza;
int iloscAktualnego=1;
int iloscNajwiekszego=0;
int staly=1;
int sumaStalego=0;
while(!feof(stdin))
{
printf("%d ",terazniejsza);
terazniejsza = scan_integer();
if(terazniejsza<poprzednia){
if(rosnie){
if(iloscAktualnego>iloscNajwiekszego){
iloscNajwiekszego=iloscAktualnego;
sumaNajwiekszego=sumaAktualnego;
}
iloscAktualnego=1;
sumaAktualnego=terazniejsza;
if(staly>1){
iloscAktualnego+=staly;
sumaAktualnego+=sumaStalego;
staly=1;
sumaStalego=0;
}
zaprzeczenie(&rosnie);
}
else{
sumaAktualnego+=terazniejsza;
iloscAktualnego++;
}
}
else if(terazniejsza>poprzednia){
if(rosnie){
sumaAktualnego+=terazniejsza;
iloscAktualnego++;
}
else{
if(iloscAktualnego>iloscNajwiekszego){
iloscNajwiekszego=iloscAktualnego;
sumaNajwiekszego=sumaAktualnego;
}
iloscAktualnego=1;
sumaAktualnego=terazniejsza;
if(staly>0){
iloscAktualnego+=staly;
sumaAktualnego+=sumaStalego;
staly=1;
sumaStalego=0;
}
zaprzeczenie(&rosnie);
}
}
else if(terazniejsza==poprzednia){
staly++;
sumaStalego+=poprzednia;
sumaStalego+=terazniejsza;
sumaAktualnego+=terazniejsza;
iloscAktualnego++;
}
poprzednia=terazniejsza;
}
if(iloscAktualnego>iloscNajwiekszego){
iloscNajwiekszego=iloscAktualnego;
sumaNajwiekszego=sumaAktualnego;
}
printf("%d %d",iloscNajwiekszego, sumaNajwiekszego);
}
inline int scan_integer()
{
register int c = gc();
int wejsciowa = 0;
for( ; ((c<48 || c>57)); c = gc() );
for( ;c>47 && c<58; c = gc() ) {
wejsciowa = (wejsciowa << 1) + (wejsciowa << 3) + c - 48;
}
return wejsciowa;
}
inline void zaprzeczenie(bool* boo){
boo=!boo;
}
P.S.:抱歉波兰变量)
#define gc getchar
请不要这样做 - 这会让其他人更难阅读和理解您的代码。
while( !feof( stream ))
并不像大多数人期望的那样工作,并且会循环太多次。相反,您需要检查上次输入操作的结果。由于您使用的是 getchar
,因此您可以检查结果:
while ( (terazniejsza = scan_integer()) != EOF )
{
...
}
...
inline int scan_integer()
{
register int c = gc();
int wejsciowa = 0;
for( ; ((c<48 || c>57) && c != EOF ); c = gc() );
for( ;c>47 && c<58 && c != EOF; c = gc() ) {
wejsciowa = (wejsciowa << 1) + (wejsciowa << 3) + c - 48;
}
return c != EOF ? wejsciowa : c;
}
我的代码没有什么问题。我尝试制作 'while' 循环,它将读取我所有的输入值,然后在我单击 EOF 时停止。我读到 windows 中的 EOF 是 CTRL+Z 等等,但我的 'while' 不想停止,在所有输入值和 CTRL+Z 之后,它会停留并等待下一个值。 这是我的代码,希望你能帮助我谢谢):
#include <stdio.h>
#include <stdbool.h>
#define gc getchar
inline int scan_integer();
inline void zaprzeczenie(bool*);
int main() {
bool rosnie=true;
int poprzednia;
register int terazniejsza;
terazniejsza = scan_integer();
poprzednia = terazniejsza;
int sumaAktualnego=terazniejsza;
int sumaNajwiekszego=terazniejsza;
int iloscAktualnego=1;
int iloscNajwiekszego=0;
int staly=1;
int sumaStalego=0;
while(!feof(stdin))
{
printf("%d ",terazniejsza);
terazniejsza = scan_integer();
if(terazniejsza<poprzednia){
if(rosnie){
if(iloscAktualnego>iloscNajwiekszego){
iloscNajwiekszego=iloscAktualnego;
sumaNajwiekszego=sumaAktualnego;
}
iloscAktualnego=1;
sumaAktualnego=terazniejsza;
if(staly>1){
iloscAktualnego+=staly;
sumaAktualnego+=sumaStalego;
staly=1;
sumaStalego=0;
}
zaprzeczenie(&rosnie);
}
else{
sumaAktualnego+=terazniejsza;
iloscAktualnego++;
}
}
else if(terazniejsza>poprzednia){
if(rosnie){
sumaAktualnego+=terazniejsza;
iloscAktualnego++;
}
else{
if(iloscAktualnego>iloscNajwiekszego){
iloscNajwiekszego=iloscAktualnego;
sumaNajwiekszego=sumaAktualnego;
}
iloscAktualnego=1;
sumaAktualnego=terazniejsza;
if(staly>0){
iloscAktualnego+=staly;
sumaAktualnego+=sumaStalego;
staly=1;
sumaStalego=0;
}
zaprzeczenie(&rosnie);
}
}
else if(terazniejsza==poprzednia){
staly++;
sumaStalego+=poprzednia;
sumaStalego+=terazniejsza;
sumaAktualnego+=terazniejsza;
iloscAktualnego++;
}
poprzednia=terazniejsza;
}
if(iloscAktualnego>iloscNajwiekszego){
iloscNajwiekszego=iloscAktualnego;
sumaNajwiekszego=sumaAktualnego;
}
printf("%d %d",iloscNajwiekszego, sumaNajwiekszego);
}
inline int scan_integer()
{
register int c = gc();
int wejsciowa = 0;
for( ; ((c<48 || c>57)); c = gc() );
for( ;c>47 && c<58; c = gc() ) {
wejsciowa = (wejsciowa << 1) + (wejsciowa << 3) + c - 48;
}
return wejsciowa;
}
inline void zaprzeczenie(bool* boo){
boo=!boo;
}
P.S.:抱歉波兰变量)
#define gc getchar
请不要这样做 - 这会让其他人更难阅读和理解您的代码。
while( !feof( stream ))
并不像大多数人期望的那样工作,并且会循环太多次。相反,您需要检查上次输入操作的结果。由于您使用的是 getchar
,因此您可以检查结果:
while ( (terazniejsza = scan_integer()) != EOF )
{
...
}
...
inline int scan_integer()
{
register int c = gc();
int wejsciowa = 0;
for( ; ((c<48 || c>57) && c != EOF ); c = gc() );
for( ;c>47 && c<58 && c != EOF; c = gc() ) {
wejsciowa = (wejsciowa << 1) + (wejsciowa << 3) + c - 48;
}
return c != EOF ? wejsciowa : c;
}