似乎找不到EOF角色?

时间:2014-01-08 02:09:07

标签: c while-loop

我有:

    #include <stdio.h>

/* Copy input to output; 2nd version. */

main(void)
{
    int c;

    while ((c = getchar()) != EOF)
        putchar(c);
    return 0;
}

我想通过输入行尾字符来终止while循环。
我尝试过输入:

"\t"
"\0"
%d
%f
%c
%x
%n
EOF
"EOF"
\nEOF
int
float
char
long
long long
array
1 => 10
all letters
all symbols on keyboard
 .
 .
 .

问题:我正在寻找什么神奇的EOF角色?

* 我很抱歉,如果这对你来说是一个非常简单的问题,但请保持愉快,我只是一个初学者,想要学习一些东西。

4 个答案:

答案 0 :(得分:2)

在Windows上, Ctrl + Z ; 在Linux上, Ctrl + D

答案 1 :(得分:2)

没有EOF个字符。 “EOF”是表示“文件结束”已满足的逻辑条件。

在Linux机器上,您可以通过在行的开头按 Ctrl + D 来“发出信号”标准输入EOF条件。

Windows系统保留一个字符Ctrl+Z,其格式为0x1A十六进制,表示此“文件结束”条件。您可以按 Ctrl + Z 输入此字符。但它仍然不是真正的EOF字符。相反,它是Windows中的一种约定。

答案 2 :(得分:1)

你去@Andy。你只是偶然使用了一个int而不是char c。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{   
    char c; 
    while ((c = getchar()) != '\t') // while input != tab, remember to use single 
        putchar(c);             // quotes for characters '\n' etc. 
    system("pause");
    return 0;
} 

如果您对UNIX / LINUX系统中的信号感到好奇,这段代码可能有所帮助,为我的一个OS实验室编写了这个代码。本质上,程序一直要求用户输入。但是,当您尝试在开头使用 ctrl + z ctrl + c 退出时,它不会t允许你,因为父进程忽略了信号,并由子进程的信号处理程序处理。请注意,父母在开始时正在睡觉,但是当它醒来时会杀死子进程并结束该程序。

#include <stdio.h> 
#include <signal.h>  
#include <malloc.h> 
#include <sys/types.h>
#include <sys/wait.h>

#define maxLength 1024
//****************************************
//  Signal Handlers For Child Process 
//****************************************
void ctrlchandler(){ 
    signal(SIGINT, SIG_IGN); //Ignore ctrl-c
    write(1, "Don't even think about it!", 26); 
} 

void ctrlzhandler(){ 
    signal(SIGTSTP, SIG_IGN); //Ignore ctrl-z
    write(1, "Nice Try.", 9);
}

//****************************************
//  Main Program
//****************************************
int main(int argc, char* argv[]){ 
pid_t pid; 
int status; 
//Dynamically allocate char array for input line 
char *inputLine = (char*)malloc(maxLength*sizeof(char)); 

//Ignore Ctrl-z and Ctrl-c 
signal(SIGINT, SIG_IGN); 
signal(SIGTSTP, SIG_IGN); 

//Fork Process 
if((pid = fork())<0){ 
     //If fork fails 
     printf("Fork Child Process Faild.\n"); 
}

//Parent Process 
else if(pid != 0){   
     printf("Parent: My child %d has been spawned.\n",pid);
     printf("My pid is %d\n",getpid()); 
     sleep(30); 
     kill(pid, SIGKILL); 
     if(waitpid(pid, &status, WUNTRACED))
        printf("Child %d has terminated abnormally.\n",pid); 
}

//Child Process 
else{ 
     sleep(1); //Wait for parent to output first 
     while(1){ 
        signal(SIGTSTP, ctrlzhandler);
        signal(SIGINT, ctrlchandler); 
        printf("Enter Input:"); 
        fgets(inputLine, maxLength, stdin); 
      }
}

//Free allocated char array 
free(inputLine); 
return 0; 
}

答案 3 :(得分:0)

main()
{
        printf ("%d=%x sizeof=%d\n", EOF, EOF, sizeof(EOF));
}

输出结果为:

-1=ffffffff sizeof=4

EOF不是char,而是int

如果您输入表示文件结尾的控制序列 - 它将被翻译为int,其值为-1