如何将字符串与EOF进行比较?

时间:2016-04-15 12:58:50

标签: c linux

我创建了一个类似于unix-shell的程序。即如果键入类似“./helloWorld”的内容,它将执行该程序,然后等待其他输入。如果输入是EOF(Ctrl + D),则程序必须终止。

我正在努力尝试比较输入而不使用getchar()或任何需要额外输入的方法。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<unistd.h> /* for fork() */
#include<sys/types.h> /* for pid_t */
#include<sys/wait.h> /* fpr wait() */

int main(int argc, char* argv[])
{   
    pid_t pid,waitPid;
    int status;
    char fileName[256];
    while(!feof(stdin))
    {
    printf(" %s > ", argv[0]);
    if (fgets(fileName, sizeof(fileName), stdin) != 0)
    {
        fileName[strcspn(fileName, "\n")] = '\0'; //strcspn = calculates the length of the initial fileName segment, which  consists of chars not in str2("\n")

    char *args[129];
    char **argv = args;
    char *cmd = fileName;
    const char *whisp = " \t\f\r\b\n";
    char *token;
    while ((token = strtok(cmd,whisp)) != 0) // strtok = breaks string into a series of tokens using the delimeter delim(whisp)
    {
        *argv++ = token;
        cmd = 0;
    }// /while

    if (getchar() == EOF)
    {
    break;
    }

    *argv = 0;

    pid = fork();
    if (pid == 0){
    execv(args[0], args);
    fprintf(stderr, "Oops! \n");
    } // /if
    waitPid = wait(&status);



}// /if(fgets..)
} // /while
return 1;

}

我想替换

if (getchar() == EOF)
        {
        break;
        }

与直接比较。像这样:if(fileName == EOF){break; }

这甚至可能吗?我已经尝试过铸造和其他方法,但到目前为止还没有任何工作。有没有我想过的不同方法? 更清楚的是,我想知道我的想法是否可行以及是否如何实现它。如果不是,我怎么能用CTRL + D终止我的程序而没有额外的输入。

1 个答案:

答案 0 :(得分:4)

无法将字符串与EOF进行比较;它不是char值,而是流上的条件(此处为stdin)。但是,getchar()char同样会将{em>读unsigned char值作为int投放到EOFfgets如果达到文件结尾或发生错误。

fgets(s, size, stream)的手册页说:

  

s成功时返回NULL,错误时发出NULL或文件结束时 未读取任何字符

fgets获得feof(stdin)后,您可以使用feof(stdin)来测试您是否已达到文件结尾;或者如果是因为错误;同样,您应该在阅读fgets的每一行后检查返回值feof(stdin)。如果-noexit返回0,则尚未到达文件结尾;如果返回值不为零,则表示已达到EOF。