gpt4 book ai didi

c - 类Shell程序C

转载 作者:行者123 更新时间:2023-11-30 20:07:24 26 4
gpt4 key购买 nike

下面的代码应该作为 shell 工作。它具有上一个和下一个选项、历史记录功能、退出和执行命令。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define BUFFER_SIZE 256
#define HISTORY_LENGTH 128

int executeCommand(char*cmd)
{
return(!strcmp(cmd,"e\n"));
}

int exitCommand(char*cmd)
{
return (!strcmp(cmd,"exit\n"));
}

int previousCommand(char*cmd)
{
return (!strcmp(cmd,"p\n"));
}

int nextCommand(char*cmd)
{
return (!strcmp(cmd,"n\n"));
}

void execute(char *line)
{
line[strlen(line)-1]='\0';
char **arguments;
char* temp;
int i=0;
arguments=(char**)malloc(sizeof(char)*10);
temp=strtok(line," ");
arguments[i]=malloc(strlen(temp)*sizeof(char));
if(arguments[i]!=NULL)
{
strcpy(arguments[i],temp);
i++;
}
else
{
printf("Out of memory");
}
while(temp!=NULL)
{
temp=strtok(NULL," ");
if(temp==NULL){
arguments[i]=NULL;
}
else{
arguments[i]=malloc(strlen(temp)*sizeof(char));
if(arguments[i]!=NULL)
{
strcpy(arguments[i],temp);
i++;
}
}
}
printf("%s ",arguments[0]);
printf("%s ",arguments[1]);
printf("%s ",arguments[2]);
execvp(arguments[0],arguments);
}

int main(int argc, char*argV[]) {
int i;
char *cmd=(char*)malloc(sizeof(char)*BUFFER_SIZE);
char **history=NULL;
int historylength=0;
int currentCommand=0;
history=(char**)malloc(sizeof(char)*BUFFER_SIZE);
do{
fgets(cmd,BUFFER_SIZE-1,stdin);
if(exitCommand(cmd))
break;
else
if(previousCommand(cmd))
{
if(currentCommand>0)
printf("%s",history[--currentCommand]);
else if(currentCommand==0)
{
currentCommand=historylength;
printf("%s",history[--currentCommand]);
}
}
else
if(nextCommand(cmd))
{
if(currentCommand<historylength)
printf("%s",history[currentCommand++]);
}
else
if(executeCommand(cmd))
{
execute(history[--currentCommand]);
}
else
{
history[historylength]=malloc(strlen(cmd)*sizeof(char));
if(history[historylength]!=NULL)
{
strcpy(history[historylength],cmd);
currentCommand=++historylength;
}
else
{
printf("Out of memory");
break;
}
}

} while(1);

free(cmd);

for(i=0;i<historylength;i++)
free(history[i]);
free(history);

return 0;
}

我想让这个函数适用于 cat 函数。我输入 e cat main.c 并希望它执行 cat 命令,但它没有执行任何操作,我在这里做错了什么?我不是这方面的专家,所以我感谢所有的帮助。

最佳答案

这是不正确的:

arguments=(char**)malloc(sizeof(char)*10);

as arguments 是一个 char**,因此代码需要分配 sizeof(char*)。更改为:

arguments = malloc(10 * sizeof(*arguments));

历史也有同样的错误。此外,请参阅Do I cast the result of malloc?

由于 strcpy() 写入终止空字符,因此为 char* 分配的空间比所需的少了一个 char。变化:

arguments[i]=malloc(strlen(temp)*sizeof(char));

至:

arguments[i] = malloc(strlen(temp) + 1);

sizeof(char) 保证为 1 并且可以在大小计算中省略。

防止i超出为参数分配的内存范围。按照目前的代码,没有任何保护措施可以防止 i 超过 9(09 是有效的i 的值作为 arguments 分配了 10 元素)。

关于c - 类Shell程序C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13809744/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com