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