c语言 - 简单的迷你外壳,由于 fgets 的工作方式,无法识别结束程序"quit"



我正试图用以下代码编写一个小单元格:

#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, " trn");
while( token != NULL ) 
{
arr[i] = token;
printf("'%s'n", arr[i]);
i++;
token = strtok(NULL," trn");
}
fflush(stdin);
printf("Write a line: n $:");
fgets(str, LINE_LEN, stdin);
}   
return 0; 
}

它工作正常,但事实上,当我键入"退出"时,程序不会结束。我想它一定与fgets有关,而且它在字符串str的末尾包含了EOF作为另一个字符,所以当我将其与"quit"进行比较时,它不是同一个字符串。我不知道从标准输入读取的字符串中提取字符的正确方法是什么。有人能帮我吗?

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

我想它一定与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",则在str"quit"之间执行指针比较,这将始终失败,因为str"quit"是不同的字符数组,因此引用内存中的不同位置。您想要的是比较两个字符串的内容;在C中,这是用strcmp:完成的

while(strcmp(str, "quit")!=0)

fgets也将从下面的语句中读取newline字符。。

fgets(str, LINE_LEN, stdin);

所以你有两个选项

  1. 使用以下条件比较"退出":

    while (strcmp(str, "quitn"))  
    
  2. 从输入中删除换行符。此处详细介绍

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

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

if(str[4] == 'n')
str[4] = '';
while (strcmp(str, "quit")!=0) {

最新更新