2015-04-11 2 views
0

В настоящее время у меня есть фрагмент кода, который сравнивает 1 вход с переменной ... , например, когда я ввожу «GET», он сравнивает его со строкой, которую я установил, а затем открывает файл. но что, если я хочу сравнить более одной строки во входном? например, если кто-то вводит «GET ./homepage.html»сравнить несколько строк в одном входе в C

поэтому первая строка GET указывает, что они хотят получить файл, а вторая строка «./homepage.html» - это файл, который они хотят просмотреть?

Мои мысли по этому поводу состоят в том, чтобы построить массив с комбинацией GET + всех возможных комбинаций файлов, а затем использовать strcomp, чтобы выбрать правильный и открыть указанный файл ..? но я не 100% от того, как я бы связал свой ввод, чтобы сравнить с целым массивом?

Текущий код ниже, очень простая строка сравнения -> открывает и записывает файл в stdout.

int main(int argc, char *argv[]) { 
MainStruct val; 
parse_config(&val); 
char userInput[100] = "success.txt"; 
char temp[100]; 

if (checkaccess() == 0) 
{ 
    parse_config(&val); 

} else { 
    fprintf(stderr,"unable to load config file\n"); 

} 

printf("Connected to Domain : %s", val.domain); 

fgets(temp, 6, stdin); 
temp[strcspn(temp, "\n")] = '\0'; 
if(strcmp(temp, "GET /") == 0) 
{ 
    openfile(userInput); 

} else { 
    printf("that was not a very valid command you gave\n"); 
} 





} 

EDIT: я должен также отметить, что вторая строка ввода должна также == UserInput, что функция openfile читает не уверен, как отделить две строки..

+1

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

+0

@ IshayPeled вы могли бы привести краткий пример? – LewisFletch

+1

Несомненно, вы можете найти пример здесь: http: //www.tutorialspoint.com/c_standard_library/c_function_strtok.htm –

ответ

0

Существует несколько способов приблизиться к этому. Самый простой вперед - прочитать полную строку ввода в temp, а затем переломить temp в токены с strtok или тому подобное. Строка ввода будет включать в себя вашу команду (например, GET) и любые другие значения, на которые вам нужно действовать. Затем вы можете принять решение, если получили достаточный ввод (то есть GET и filename), чтобы затем ответить, как вы планируете.

Ниже приведен краткий пример, который создает массив массивов символов (строк) для хранения маркеров, введенных как temp. Пара определяет в начале ограничение каждого токена на 64 символов и максимальное количество токенов до 5 (при необходимости отрегулируйте). Затем он разбивает temp на токены и проверяет, введен ли пользователь более чем на 1 слово. Затем он отвечает на GET и показывает собранный filename. (вы можете предпринять любые действия, которые вам нужны). Он также проверяет количество введенных токенов, чтобы убедиться, что вы не пытаетесь писать и писать за пределами массива.

Посмотрите и дайте мне знать, если у вас есть вопросы:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define MAXISZ 64 
#define MAXIN 5 

int main (void) { 

    char temp[MAXISZ] = {0};   /* temp variable */ 
    char input[MAXIN][MAXISZ] = {{0}}; /* array of strings to hold input */ 
    size_t icnt = 0;     /* number of input words   */ 
    size_t tlen = 0;     /* length of temp read by fgets */ 

    printf ("\n Enter command [filename]: "); 
    if (fgets (temp, MAXISZ, stdin) == NULL) { 
     printf ("error: fgets failed.\n"); 
     return 1; 
    } 

    /* get length and trim newline */ 
    tlen = strlen (temp); 
    while (tlen > 0 && temp[tlen - 1] == '\n') 
     temp[--tlen] = 0; 

    /* if temp contains a space */ 
    if (strchr (temp, ' ')) 
    { 
     /* break tmp into tokens and copy to input[i] */ 
     char *p = NULL; 
     for (p = strtok (temp, " "); p != NULL; p = strtok (NULL, " ")) 
     { 
      strcpy (input[icnt++], p); 

      /* check if MAXIN reached */ 
      if (icnt == MAXIN) 
      { 
       printf ("error: MAXIN token exceeded.\n"); 
       break; 
      } 
     } 

     /* if more than 1 word input, use 1st as command, next as filename */ 
     if (icnt > 0) 
     { 
      if (strcmp (input[0], "GET") == 0) 
       printf ("\n You can open file : %s\n", input[1]); 
     } 

    } 
    else 
     printf ("\n Only a single word entered as command '%s'.\n", temp); 

    printf ("\n"); 

    return 0; 
} 

Выходные

$ ./bin/fgets_split 

Enter command [filename]: GET /path/to/myfile.txt 

    You can open file : /path/to/myfile.txt 

или

$ ./bin/fgets_split 

Enter command [filename]: GET 

    Only a single word entered as command 'GET'. 
Смежные вопросы