2016-10-02 3 views
1

Я пытался оправдать свою логику при чтении ввода для моего интерпретатора команд. Проблема, с которой я столкнулся, это strstr() либо не принимает "%s" как игла, либо обрабатывает весь haystack как строку и игнорирует пробелы, символы перевода и т. Д. Из-за этого.Определение нескольких разделенных пространством входов в буфере C

char command[4] = ""; 
char arg1[512] = ""; 
char arg2[512] = ""; 
char tmp[1029] = ""; 
char buffer[BUFFERSIZE]; 
memset(buffer, '\0', BUFFERSIZE); 

while(fgets(buffer, BUFFERSIZE, stdin) != NULL){ 
    strcpy(command, ""); 
    strcpy(arg1, ""); 
    strcpy(arg2, ""); 
    strcpy(tmp, ""); 
    if(strstr(buffer, "%s\n") != NULL) 
     sscanf(buffer, "%s", command); // 0 arguments 
    if(strstr(buffer, "%s %s") != NULL) 
     sscanf(buffer, "%s", arg1);  // 1 argument 
    if(strstr(buffer, "%s %s %s") != NULL) 
     sscanf(buffer, "%s", arg2);  // 2 arguments 
    printf("%s %s %s\n", command, arg1, arg2); 
} 

Независимо от того, что я вход:

  • ком
  • вал argument1val
  • CMD arg1 arg2val
  • и т.д.

Я всегда в конечном итоге с пустыми массивами символов для command, arg1 и arg2.

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

ответ

1

Вы просто должны сканировать один раз и проверить числа проанализированных аргументов, sccanf возвращает (со специальной проверки для пустой строки вошли)

#include <stdio.h> 
#include <strings.h> 

#define BUFFERSIZE 2000 

int main() 
{ 
int nb_args; 
char command[4] = ""; 
char arg1[512] = ""; 
char arg2[512] = ""; 
char buffer[BUFFERSIZE]; 
memset(buffer, '\0', BUFFERSIZE); 

while(fgets(buffer, BUFFERSIZE, stdin) != NULL){ 
    strcpy(command, ""); 
    strcpy(arg1, ""); 
    strcpy(arg2, ""); 

    nb_args = sscanf(buffer, "%3s%511s%511s", command,arg1,arg2); 
    if (strlen(command)==0) 
    { 
     printf("empty line\n"); 
    } 
    else 
    { 
    switch(nb_args) 
    { 
     case 1: 
      printf("Command = %s\n",command); 
      break; 
     case 2: 
      printf("Command = %s, arg1 = %s\n",command,arg1); 
      break; 
     case 3: 
      printf("Command = %s, arg1 = %s, arg2 = %s\n",command,arg1,arg2); 
      break; 
    } 
    } 
} 
} 
+0

Это была именно та логика, которую я пытался придумать! Спасибо за вашу помощь! –

0

strstr функция не используется printf style формат струна. Он ищет точное содержание второго аргумента в первом аргументе.

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

char *p; 
p = strtok(buffer, " "); 
if (p) { 
    strcpy(command, p); 
    p = strtok(NULL, " "); 
    if (p) { 
     strcpy(arg1, p); 
     p = strtok(NULL, " "); 
     if (p) { 
      strcpy(arg2, p); 
     } 
    } 
} 
0

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

Есть и другие подходы, но если вы напишете эту функцию, это даст вам представление о том, как строятся строки в памяти и как их манипулировать.