Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用c语言解析用户输入_C_Parsing - Fatal编程技术网

用c语言解析用户输入

用c语言解析用户输入,c,parsing,C,Parsing,我很难用c语言解析用户输入。我的任务(家庭作业)是读取用户输入,然后像BASH一样解析,所以分隔符是“”、|、>,等等。到目前为止,我的(错误的)解决方案使用strok。有人建议我使用sscanf,但我还不能完全理解它如何适用于所有用户输入的情况 我希望有一个能为我指明正确方向的策略。以下是我目前掌握的情况: #include <stdio.h> #include <unistd.h> #include <string.h> #define MAX_LINE

我很难用c语言解析用户输入。我的任务(家庭作业)是读取用户输入,然后像BASH一样解析,所以分隔符是“”、|、>,等等。到目前为止,我的(错误的)解决方案使用strok。有人建议我使用sscanf,但我还不能完全理解它如何适用于所有用户输入的情况

我希望有一个能为我指明正确方向的策略。以下是我目前掌握的情况:

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

#define MAX_LINE 80


int main ()
{

    const char delim[]=" \\|\\>\\1>\\2>\\>>\\2>>\\&>\\<";

    char* args[MAX_LINE/2 + 1];
    char tok[MAX_LINE];
    char* token;

    printf("osh>");

    fgets(tok, sizeof(tok), stdin);

    token = strtok(tok,delim);

    while (token != NULL)
    {   
        printf("%s\n", token);

        token = strtok(NULL, delim);
    }            

    return 0;

}
#包括
#包括
#包括
#定义最大行80
int main()
{
const char delim[]=“\\\\>\\1>\\2>\>\\2>\>\\&>\\”;
fgets(tok、sizeof(tok)、stdin);
令牌=strtok(tok,delim);
while(令牌!=NULL)
{   
printf(“%s\n”,标记);
token=strtok(NULL,delim);
}            
返回0;
}
方法1) 您可以使用指针算术来定位分隔符,同时仍然使用strtok来提取分隔字符串。在我看来,这似乎是最简单的解决办法,但需要更多的时间。确保不要试图访问数组末尾以外或数组之前的“tok”(通过过度递减指针)

例如:

token = strtok(tok, delim);
char verb = *token--;
方法2) 您可以用同样的方式使用sscanf查找字符串,然后是单个字符,然后是字符串。。。等等,直到你到达终点

对于这两种方法,您都需要将字符串和分隔符存储在某个位置,并保持顺序,以便重新构建序列


祝你好运。

谢谢你在这方面的帮助。我最终选择了完全不同的路线,基本上跟踪fgets结果的每个索引的内容,然后从那里进行解析。我最终没有使用任何c-ish方法(即strtok)来完成这项工作

下面是一个示例片段

        {
            //integers correspond to ASCII values
            LEN++;
            if ((line[i+1] == 60) || (line[i+1] == 62) || (line[i+1] == 124) || (line[i+1] == 38) || (line[i+1] == 32) || (line[i+1] == 10))
            {
                memcpy(substring, &line[string_start], LEN);
                substring[LEN] = '\0';
                args[token_number] = malloc(strlen(substring) + 1);
                strcpy(args[token_number], substring);

                token_number++;
                string_start = i+1;
                LEN = 0;  
            }

            i++;
        }

如果您的目标只是使用分隔符分割行,那么我认为您走的方向是正确的。您现有的解决方案有什么问题?我使用了这些分隔符,但需要检索它们。所以想象一下这样的输入:gedithw>txtAh!对,strtok不会告诉您匹配了哪个分隔符。因此,如果您需要分隔符,那么它将不会像您发现的那样工作。我将发布一个带有一些建议的答案。什么是
“\\\\\>\\1>\\2>\\>\\2>\&>\\