在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。 必须有两个命令:quit(退出程序)和Set Prompt(更改提示)。 由于某些原因,“退出”有效,但“设置提示”无效。 我怎样才能解决这个问题?在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”未声明(首次在此函数中
谢谢你你的程序确实有很多问题 试图给你一些提示,在不为你解决整个练习的情况下,在哪里可以改进,这里我偶然发现了一些要点: 一般问题 程序无法编译
错误:输入结束时需要声明或语句
stdio.h
,导致:
错误:“stdin”未声明(首次在此函数中使用)
-Werror
开关的结果:
错误:格式不是字符串文字且没有格式参数[-Werror=格式安全性]
然而,在第13行更改printf(提示符);
可能不是最糟糕的主意。(请参阅:)else if(strcmp(第行,“设置提示”)==0){
第24行
将永远不会执行,因为之前对strtok()
的调用将用“Set\0Prompt which…”替换形式“Set Prompt which…”的任何输入,而不是(!)替换为“Set Prompt\0which…”#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