#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提示不起作用。 我怎样才能解决这个问题? 谢谢
答案 0 :(得分:0)
你的程序确实似乎有很多问题。
试图给你一些提示,在没有为你解决整个练习的情况下改进的地方,这里有一些我偶然发现:
Gemeral问题
该程序无法编译!
缺少右括号(最有可能在第35行)导致:
error: expected declaration or statement at end of input
缺少stdio.h
包含的内容:
error: ‘stdin’ undeclared (first use in this function)
...
最后一个是我编译尝试中使用的-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)
逻辑问题
以下块
第24行 else if(strcmp(line, "Set Prompt") == 0){
将永远不会被执行,因为先前对strtok()
的调用将替换表格的任何输入&#34; 设置提示无论什么...... &#34;用&#34; 设置\ 0提示...... &#34;不是(!)与&#34; 设置提示\ 0whatever ... &#34;
即使解决了这个问题,仍然会有一些怪异的行为。
要重现尝试将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()