Моя оболочка должна интерпретировать двойную кавычку - PullRequest
1 голос
/ 28 марта 2012

Я должен написать оболочку, которая может интерпретировать двойные кавычки.Я написал базовую оболочку.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
  int main ()
  {
    int i;
char * ligne;
char *tokens[100];
ligne=(char*)malloc(300);
printf("$ ");
fgets(ligne,256,stdin);
while (strcmp(ligne,"exit\n"))
{   i=0;
    tokens[i]=strtok(ligne," \n");
    while (tokens[i] != NULL) tokens[++i]=strtok(NULL," \n");
    if (fork()==0)
    {   execvp(tokens[0],tokens);
        printf("Commande invalide\n");
        exit(1);
    }
    wait(0);
    printf("$ ");
    fgets(ligne,256,stdin);
}
exit(0);
}

В оболочке linux: Когда вы вводите команду типа

 $ echo "`a     b`"

Оболочка интерпретирует пробелы и, следовательно,

a     b
*В качестве файла берется 1009 *.

Я не вижу, как убрать двойные кавычки и оставить пробелы.Спасибо.

1 Ответ

1 голос
/ 20 марта 2014

strtok не подходит для этого. Заменить

    tokens[i]=strtok(ligne," \n");
    while (tokens[i] != NULL) tokens[++i]=strtok(NULL," \n");

е. г. с

    char quot = 0, *cp;
    for (cp = ligne; tokens[i] = cp += strspn(cp, " \n"), *cp; ++i)
    {
        do if (*cp == '"') quot ^= 1, memmove(cp, cp+1, strlen(cp));
         while (cp += strcspn(cp, quot ? "\"" : " \n\""), *cp == '\"');
        if (*cp) *cp++ = '\0';
    }
    tokens[i] = NULL;
    if (quot) puts("unmatched quotation mark");
    else

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...