![](/img/trans.png)
[英]How to parse a string from fgets to be stored in argv[] for a simple command line interpreter?
[英]Simple Command Line Interpreter
我需要實現一個簡單的命令行解釋器,能夠解釋一組內部實現的命令。 我嘗試使用此代碼,但它根本不起作用。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define MAXIMO 2048
#define BLANCO " "
#define FIN "FIN"
#define MSG_ERROR "ERROR!"
#define PROMPT "\n#@> "
int hayAmpersand(char cadena[]);
int main(int argc, char *argv[]) {
char comando[MAXIMO] = "";
char *palabras[MAXIMO];
int e, i, ampersand;
pid_t hijo, hijoMuerto;
while(1) {
// Vacio las cadenas al inicio de cada bucle
comando[0] = '\0';
ampersand = 0;
printf(PROMPT);
scanf("\n%[^\n]", comando); // Leemos la cadena entera
if (strcmp(comando, FIN) == 0)
return (0); // Si son iguales sale del programa
if (hayAmpersand(comando) == 1)
ampersand = 1;
//== Cadenas
//==========================================================
// Sacamos la primera palabra de la cadena
palabras[0] = strtok(comando, BLANCO);
// Sacamos la otras palabras de la cadena
i = 1;
while ((palabras[i] = strtok(NULL, BLANCO)) != NULL)
i++;
//== Fin Cadenas
//======================================================
hijo = fork();
switch (hijo) {
case -1:
perror(MSG_ERROR);
exit(-1);
case 0:
execvp(palabras[0], &palabras[0]);
perror(MSG_ERROR);
exit(e);
default:
if (ampersand != 1) {
hijoMuerto = 0;
while ((hijo != hijoMuerto) && (hijoMuerto != -1))
hijoMuerto = wait(&e);
}
}
}
return (0);
}
int hayAmpersand(char cadena[]) {
int j = 0;
for (j = 0; j <= strlen(cadena); j++) {
if (cadena[j] == '&') {
cadena[j] = cadena[j + 1];
return(1);
}
}
return (0);
}
這是練習: http : //ciprianpungila.com/uvt/so2018/projects/35.txt
或多或少它有效,但練習需要實現鍵盤箭頭,我不知道如何在我的代碼中做到這一點,如果有人可以幫助我,我將非常感激
命令行編輯不是要求的一部分。 您也沒有明確禁止使用readline()
,它可能在您的系統上可用並執行該操作。
請注意,您當前的實現需要更多的工作才能滿足實際需求,因此我建議您專注於這些,而不是浪費時間嘗試重新實現命令行編輯器。 正確地做到這一點並非易事。
另請注意,您使用scanf()
不適合讀取輸入行: scanf("\\n%[^\\n]", comando);
確實會忽略任何空格並讀取命令直到下一個換行符(排除),但它可能會寫入超出commando
數組末尾的內存,這會導致未定義的行為。 您應該改為使用fgets()
、 readline()
或自定義編寫的函數來讀取用戶的輸入。 您還將檢測可能有用的文件結尾:)
您可以使用readline
代替scanf
:
char *command = readline(PROMPT);
但是,我不確定您是否可以使用readline
進行鍛煉...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.