2014-11-17 4 views
0

Мне нужно создать программу, которая будет эмулировать терминал Linux. Поскольку для некоторых системных вызовов требуется 1,2 или более аргументов, я хочу убедиться, что количество заданных параметров верное. Я использую strtok(), чтобы отделить имя вызова от аргументов, но мне нужно знать, сколько жетонов strtok() создано для его сравнения.Подсчет количества токенов строки в C

Вот и пример код:

char *comand = (char*) malloc(sizeof(char)*100); 
char *token; 
char *path1 = (char*) malloc(sizeof(char)*100); 
char *path2= (char*) malloc(sizeof(char)*100); 



    fgets(comand, 100, stdin); 

    printf("\nYou entered: %s \n", comand); 

    token = strtok(comand ," "); 

    //Check the number of tokens and add a condition in each IF to match 

    if (strcmp("ls",token) == 0) { 
     token = strtok(NULL," "); 
     strcpy(path1,token); 

    } 
    else if (strcmp("cat",token) == 0) { 
     token = strtok(NULL," "); 
     strcpy(path1,token); 

    } 
    else if (strcmp("cp",token) == 0) { 
     token = strtok(NULL," "); 
     strcpy(path1,token); 
     token = strtok(NULL," "); 
     strcpy(path2,token); 

    } 
    else if (strcmp("mv",token) == 0) { 
     token = strtok(NULL," "); 
     strcpy(path1,token); 
     token = strtok(NULL," "); 
     strcpy(path2,token);  

    } 
    else if (strcmp("find",token) == 0) { 
     token = strtok(NULL," "); 
     strcpy(path1,token); 

    } 
    else if (strcmp("rm",token) == 0) { 
     token = strtok(NULL," "); 
     strcpy(path1,token); 

    } 
    else if (strcmp("mkdir",token) == 0) { 
     token = strtok(NULL," "); 
     strcpy(path1,token); 
    } 
    else if (strcmp("rmdir",token) == 0) { 
     token = strtok(NULL," "); 
     strcpy(path1,token); 
    } 
    else if (strcmp("quit",token) == 0) { 
     exit(0); 
    } 
    else print("Number of parameters do not match); 
+1

«Системные вызовы»? С консоли? – EOF

+0

Нет, «Системные вызовы» этого «терминала» - это процедуры, сделанные на языке C, а не в Unix. Если команда «ls», я бы назвал процедуру с именем «commLs» или что-то в этом роде и передал ей токены. – tony

+0

Вы также можете проверить этот вопрос: http://stackoverflow.com/questions/13078926/is-there-a-way-to-count-tokens-in-c –

ответ

0

единственное strtok() делает искать следующее вхождение разделителя и перезаписать этот символ с \0 и возвращают указатель с зачетом добавили. указатель хранится в статической переменной, поэтому последующий вызов его с NULL для char * будет выполнять его в последней строке, используемой из смещения, который был найден последним разделителем.

эта страница имеет очень хороший пример: http://en.cppreference.com/w/c/string/byte/strtok

Если вы хотите, чтобы сосчитать аргументы, было бы проще в использовании strchr(), эта функция выполняет поиск символа и возвращает указатель на его место. вы можете использовать его так.

unsigned int i = 0; 
char *temp = token; 
while ((temp = strchr(temp, '') != NULL)) { 
    ++i; 
} 

это имеет дополнительное преимущество, не изменяя исходный массив символов в то время как strtok() делает!

Я бы справился с этим в рамках функций, которые вы создаете для каждой команды.

вы передаете все возможности функции и там вы ее разобрали. либо с strtok(), либо любым другим, что вы хотите использовать.

Это держит его красивым и чистым в подпрограммах, и вы всегда будете знать, чего ожидать.

if (strcmp("ls",token) == 0) { 
    token = strtok(NULL," "); 
    strcpy(path1,token);  // I would maybe change the path variable name to args 
    ret = lscmd(path1); 
    if (ret == -1) { 
     // invalid input detected 
    } 
} 

, то вы бы иметь функцию Ls

int lsdcmd(char *args) { 
    // parse args for argumants you are looking for, return -1 if it fails 

    // do whatever you want to do. 
} 
0

Вы можете рассчитывать аргументы, используя strtok таким образом:

Пример:

const char* delimiter = ","; 
char* tokens[MAX_NUM_OF_ARGS]; 

unsigned int index = 0; 
char* temp = strtok(buff,delimiter); 
while (temp!=NULL){ 
    if(index<MAX_NUM_OF_ARGS){ 
     tokens[index]=temp; 
    } 
    index++; 
    temp = strtok(NULL,delimiter); 
} 

Позже вы можете перебирать массив указателей (токенов) и сравнить их ...

Смежные вопросы