【问题标题】:Simple Command Line Interpreter简单的命令行解释器
【发布时间】:2019-03-25 18:37:02
【问题描述】:

我需要实现一个简单的命令行解释器,能够解释一组内部实现的命令。我尝试使用此代码,但它根本不起作用。

#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吗?
  • 简单的谷歌搜索c programming reading arrow keys 给出了足够的答案。
  • 如果您可以更具体一些,这将对您的问题有所帮助,例如如何捕获箭头键,或者,如果您已经捕获它们,如何移动光标?现在,您的问题基本上是请人为您完成作业。
  • @jesusbedoya:您可以通过点击分数下方的灰色复选标记来接受其中一个答案。

标签: c terminal


【解决方案1】:

命令行编辑不是要求的一部分。您也没有明确禁止使用readline(),它可能在您的系统上可用并执行此操作。

请注意,您当前的实现需要做更多工作才能满足实际需求,因此我建议您专注于这些工作,而不是浪费时间尝试重新实现命令行编辑器。正确地做到这一点并非易事。

还请注意,您使用 scanf() 不适合读取输入行:scanf("\n%[^\n]", comando); 确实会忽略任何空格并将命令读取到下一个换行符(排除),但它可能会写入超出commando 数组的末尾,这会导致未定义的行为。您应该改为使用fgets()readline() 或自定义编写函数来读取用户的输入。您还将检测到可能有用的文件结尾:)

【讨论】:

    【解决方案2】:

    您可以使用readline,而不是使用scanf

    char *command = readline(PROMPT);
    

    但是,我不确定您是否可以使用 readline 进行锻炼...

    【讨论】:

    • 您距离获得下一个特权只有一点距离。那一定很诱人:)
    • 那么你提出的是另一种不解决问题的方法?这如何回答这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    相关资源
    最近更新 更多