gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:59 26 4
gpt4 key购买 nike

我创建了一个类似于 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 终止我的程序而不需要额外的输入。

最佳答案

无法将字符串与 EOF 进行比较;它不是 char 值,而是流的条件(此处为 stdin)。然而 getchar() 和类似的方法将返回 读取的 char 作为 unsigned char 转换为 intEOF(如果已到达文件末尾或发生错误)。


fgets 的手册页说:

fgets(s, size, stream) returns s on success, and NULL on error or when end of file occurs while no characters have been read.

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

关于c - 如何将字符串与 EOF 进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36647846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com