2016-10-02 57 views
1

我一直在为我的命令解释器读取输入内容时尝试证明我的逻辑合理。我遇到的问题是strstr()或者不接受"%s"作为或正在将整个干草堆视为一个字符串,并且因此无视空格,换行符等。在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); 
} 

不管我输入:

  • COM
  • VAL argument1val
  • CMD ARG1 arg2val

我总是最后空字符数组commandarg1arg2

我的输入将始终是单个字符串或多达三个空格分隔的字符串,后跟一个换行符。

回答

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样式格式字符串。它会查找第一个参数中第二个参数的确切内容。

你想要使用的是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

你将很快需要一个合适的回答。 这是取一个包含任意空格的字符串,通过删除开头和结尾的空格来修剪它,然后用空格替换所有的空格字符。然后建立一个知道单个空格是分隔符的单词列表。

还有其他的方法,但是如果你写这个函数,它会让你理解字符串是如何在内存中布局的,以及如何操纵它们。