确定C缓冲区中的多个空间分隔输入

确定C缓冲区中的多个空间分隔输入,c,strstr,C,Strstr,在为命令解释器读取输入时,我一直试图证明我的逻辑是正确的。我遇到的问题是strstr() 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(

在为命令解释器读取输入时,我一直试图证明我的逻辑是正确的。我遇到的问题是
strstr()

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
对于
command
arg1
arg2
,我总是以空字符数组结束


我的输入将始终是单个字符串或最多三个空格分隔的字符串,后跟换行符。
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);
        }
    }
}

您只需扫描一次并检查
sccanf
返回的已解析参数的数量(特别检查输入的空行)

#包括
#包括
#定义缓冲区大小2000
int main()
{
int nb_args;
char命令[4]=“”;
字符arg1[512]=“”;
字符arg2[512]=“”;
字符缓冲区[BUFFERSIZE];
memset(缓冲区'\0',缓冲区大小);
while(fgets(buffer,BUFFERSIZE,stdin)!=NULL){
strcpy(命令“”);
strcpy(arg1,“”);
strcpy(arg2,“”);
nb_args=sscanf(缓冲区,“%3s%511s%511s”,命令arg1,arg2);
如果(strlen(命令)==0)
{
printf(“空行\n”);
}
其他的
{
开关(nb_参数)
{
案例1:
printf(“命令=%s\n”,命令);
打破
案例2:
printf(“命令=%s,arg1=%s\n”,命令arg1);
打破
案例3:
printf(“命令=%s,arg1=%s,arg2=%s\n”,命令,arg1,arg2);
打破
}
}
}
}

您将很快需要一个正确的答案。 这就是获取一个包含任意空格的字符串,通过删除前导和尾随空格对其进行修剪,然后用单个空格替换所有的空格字符。然后建立一个单词列表,知道一个空格是分隔符


还有其他的方法,但是如果您编写这个函数,它将让您了解字符串在内存中的布局以及如何操作它们

这正是我试图想出的逻辑!谢谢你的帮助!
#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;
    }
    }
}
}