使用“Set prompt”命令在C中创建简单的shell

时间:2014-11-12 02:25:32

标签: c shell prompt

#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;
  }

我正在编写一个程序,我必须在C中编写自己的shell。 必须有两个命令:quit(退出程序)和Set Prompt(更改提示)。 出于某种原因退出工作但Set提示不起作用。 我怎样才能解决这个问题? 谢谢

1 个答案:

答案 0 :(得分:0)

你的程序确实似乎有很多问题。

试图给你一些提示,在没有为你解决整个练习的情况下改进的地方,这里有一些我偶然发现:

Gemeral问题

该程序无法编译!

  1. 缺少右括号(最有可能在第35行)导致:

    error: expected declaration or statement at end of input

  2. 缺少stdio.h包含的内容:

    error: ‘stdin’ undeclared (first use in this function) ...

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

    error: format not a string literal and no format arguments [-Werror=format-security]

    然而,在第13行更改printf(PROMPT);可能不是最糟糕的主意。(请参阅:http://en.wikipedia.org/wiki/Uncontrolled_format_string

  4. 逻辑问题

    1. 以下块

      第24行

      else if(strcmp(line, "Set Prompt") == 0){

      将永远不会被执行,因为先前对strtok()的调用将替换表格的任何输入&#34; 设置提示无论什么...... &#34;用&#34; 设置\ 0提示...... &#34;不是(!)与&#34; 设置提示\ 0whatever ... &#34;

    2. 即使解决了这个问题,仍然会有一些怪异的行为。

      要重现尝试将set prompt命令更改为&#34; SetPrompt&#34;在您的代码中并启动会话。如果你得出与我不同的结果,我会感到惊讶:

      SUPER SHELL!!SetPrompt myprompt:
      myprompt:what the hell is going on here?
      sh: 1: what: not found
      ell is going on here?
      quit
      

      提示第29行else {PROMPT =arg;上的简单分配将无效,因为arg指向的内存将在下次fgets(line, MAX_LENGTH, stdin)获取时被覆盖在第14行打电话。

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