在C中使用“创建简单的shell”;设置提示";命令 #包括 #包括 #定义最大长度1024 #定义空格“\t\r\n” int main(int argc,char*argv[]){ 字符行[最大长度]; char*cmd; char*PROMPT=“超级SHELL!!”; 而(1){ printf(提示); 如果(!fgets(直线,最大长度,标准长度))中断; //解析和执行命令 if((cmd=strtok(行,空格))){ //清除错误 errno=0; 如果(strcmp(cmd,“quit”)==0){ 打破 } else if(strcmp(第行,“设置提示”)==0){ char*arg=strtok(0,空格); 如果(!arg){ fprintf(stderr,“您缺少提示。\n”); } else{PROMPT=arg; } } else系统(行); if(errno)perror(“命令失败,对不起”); } 返回0; }

在C中使用“创建简单的shell”;设置提示";命令 #包括 #包括 #定义最大长度1024 #定义空格“\t\r\n” int main(int argc,char*argv[]){ 字符行[最大长度]; char*cmd; char*PROMPT=“超级SHELL!!”; 而(1){ printf(提示); 如果(!fgets(直线,最大长度,标准长度))中断; //解析和执行命令 if((cmd=strtok(行,空格))){ //清除错误 errno=0; 如果(strcmp(cmd,“quit”)==0){ 打破 } else if(strcmp(第行,“设置提示”)==0){ char*arg=strtok(0,空格); 如果(!arg){ fprintf(stderr,“您缺少提示。\n”); } else{PROMPT=arg; } } else系统(行); if(errno)perror(“命令失败,对不起”); } 返回0; },c,shell,prompt,C,Shell,Prompt,我正在写一个程序,我必须用C语言编写自己的shell。 必须有两个命令:quit(退出程序)和Set Prompt(更改提示)。 由于某些原因,“退出”有效,但“设置提示”无效。 我怎样才能解决这个问题? 谢谢你你的程序确实有很多问题 试图给你一些提示,在不为你解决整个练习的情况下,在哪里可以改进,这里我偶然发现了一些要点: 一般问题 程序无法编译 缺少闭合支撑(很可能在第35行),导致: 错误:输入结束时需要声明或语句 缺少包含stdio.h,导致: 错误:“stdin”未声明(首次在此函数中

我正在写一个程序,我必须用C语言编写自己的shell。 必须有两个命令:quit(退出程序)和Set Prompt(更改提示)。 由于某些原因,“退出”有效,但“设置提示”无效。 我怎样才能解决这个问题?
谢谢你

你的程序确实有很多问题

试图给你一些提示,在不为你解决整个练习的情况下,在哪里可以改进,这里我偶然发现了一些要点:

一般问题

程序无法编译

  • 缺少闭合支撑(很可能在第35行),导致:

    错误:输入结束时需要声明或语句

  • 缺少包含
    stdio.h
    ,导致:

    错误:“stdin”未声明(首次在此函数中使用)

  • 最后一个是编译尝试中使用的
    -Werror
    开关的结果:

    错误:格式不是字符串文字且没有格式参数[-Werror=格式安全性]

    然而,在第13行更改
    printf(提示符);
    可能不是最糟糕的主意。(请参阅:)

  • 逻辑问题

  • 下面的街区

    else if(strcmp(第行,“设置提示”)==0){
    第24行

    将永远不会执行,因为之前对
    strtok()
    的调用将用“Set\0Prompt which…”替换形式“Set Prompt which…”的任何输入,而不是(!)替换为“Set Prompt\0which…”

  • 即使解决了这个问题,仍然会有一些可怕的行为

    若要复制,请尝试在代码中将set prompt命令更改为“SetPrompt”,然后启动会话。如果您得到的结果与我的不同,我会感到惊讶:

    #include <string.h>
    #include <errno.h>
    
    #define MAX_LENGTH 1024
    #define SPACES " \t\r\n"
    
    int main(int argc, char *argv[]){
    char line[MAX_LENGTH];
    char *cmd;
    char *PROMPT = "SUPER SHELL!!";
    
    while(1){
        printf(PROMPT);
        if (!fgets(line, MAX_LENGTH, stdin)) break;
    
        //parse and execute commands
    
        if((cmd = strtok(line, SPACES))){
        // clean errors
        errno=0;
        if (strcmp(cmd, "quit") ==0){
        break;
        }
        else if(strcmp(line, "Set Prompt") == 0){
        char *arg = strtok(0, SPACES);
        if (!arg){
            fprintf(stderr, "You were missing a prompt. \n");
        }
        else {PROMPT =arg;
      }
        }
      else system(line);
      if(errno) perror ("Command failed. sorry");
      }
      return 0;
      }
    
    超级SHELL!!设置提示符myprompt: 我的提示:这到底是怎么回事? sh:1:什么:找不到 这是怎么回事? 退出 提示:第29行的简单赋值
    否则{PROMPT=arg;
    将不起作用,因为
    arg
    指向的内存将在下次
    fgets(line,MAX_LENGTH,stdin)
    在第14行被调用时被覆盖

    尝试为提示字符串保留一些额外内存,并查找
    strcpy()


  • 您的代码非常混乱。您的“设置提示”问题可能是由于Set和Prompt被读取为两个输入。是的,这似乎是个问题,但我不知道如何将itAlright分开,这是一场灾难。我试图格式化代码并修复命名约定,但我认为在尝试类似的操作之前,您需要学习更多。从小处开始,逐步添加。 SUPER SHELL!!SetPrompt myprompt: myprompt:what the hell is going on here? sh: 1: what: not found ell is going on here? quit