1

我正在尝试使用以下代码编写一个 minishell:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LINE_LEN  50
#define MAX_PARTS  50

int main ()
{
char* token;
char str[LINE_LEN];
char* arr[MAX_PARTS];
int i,j;

printf("Write a line: \n $:");
fgets(str, LINE_LEN, stdin);

while (str != "quit") {
    i=0;
    token = strtok(str, " \t\r\n");
    while( token != NULL ) 
    {
        arr[i] = token;
        printf("'%s'\n", arr[i]);
        i++;
        token = strtok(NULL," \t\r\n");
    }
    fflush(stdin);

    printf("Write a line: \n $:");
    fgets(str, LINE_LEN, stdin);
}   
return 0; 
}

它工作正常,但是当我输入“退出”时,程序并没有结束。我想它一定与 fgets 以及它在字符串 str 的末尾将 EOF 作为另一个字符合并的事实有关,所以当我将它与“quit”进行比较时,它不是同一个字符串。我不知道从标准输入读取的字符串中提取 \n 字符的正确方法是什么。¿ 有人可以帮帮我吗?

我想问的另一个问题是在这段代码中使用 fflush 是否是个好主意。谢谢

4

4 回答 4

2

我想它一定与 fgets 以及它在字符串 str 的末尾将 EOF 作为另一个字符合并的事实有关,所以当我将它与“quit”进行比较时,它不是同一个字符串。

没有。

首先,EOF它不作为字符存在,它只是一些 IO 函数返回的标志,告诉您文件在尝试读取时已完成。

字符串中fgets留下的是换行符(如果它因此而停止,而不是因为 EOF 或错误)。您可以在获取字符串后轻松删除它 - 如果它存在的话:

size_t l=strlen(str);
if(l && str[l-1]=='\n')
    str[l-1]=0;

但最重要的是,你得到的比较是"quit"错误的。

如果您编写str != "quit",您正在执行和之间的指针比较,这将始终失败,因为and是不同的字符数组,因此引用内存中的不同位置。你想要的是比较两个字符串的内容;在 C 中,这是通过以下方式完成的:str"quit"str"quit"strcmp

while(strcmp(str, "quit")!=0)
于 2014-02-09T16:24:47.313 回答
2

fgets也会从下面的语句中读取newline字符..

fgets(str, LINE_LEN, stdin);

所以你有两个选择

  1. 使用如下条件来比较“退出”:

    while (strcmp(str, "quit\n"))  
    
  2. 从输入中删除换行符。详细在这里

于 2014-02-09T16:25:37.777 回答
0

你不能像你一样通过指针比较字符串str != "quit"

改为使用0 != strcmp(str,"quit")

于 2014-02-09T16:17:16.900 回答
0
if(str[4] == '\n')
    str[4] = '\0';
while (strcmp(str, "quit")!=0) {
于 2014-02-09T16:45:39.563 回答