在C中解析命令行并使用指针替换字符
我正在写一个简单的shell。我编写了一个解析器来标记命令行,将其发送到在C中解析命令行并使用指针替换字符,c,parsing,C,Parsing,我正在写一个简单的shell。我编写了一个解析器来标记命令行,将其发送到execvp。我想在解析时检查字符&,并将其替换为\0。我正在使用指针,对如何继续操作有点困惑。以下是我的解析器代码: void parseArgs(char *input, char **args, int *background) { while (*input != '\0') { while (*input == ' ' || *input == '\t' || *input == '\n'
execvp
。我想在解析时检查字符&
,并将其替换为\0
。我正在使用指针,对如何继续操作有点困惑。以下是我的解析器代码:
void parseArgs(char *input, char **args, int *background)
{
while (*input != '\0') {
while (*input == ' ' || *input == '\t' || *input == '\n')
*input++ = '\0'; /* replace empty spaces */
*args++ = input; /* save argument position */
while (*input != '\0' && *input != ' ' &&
*input != '\t' && *input != '\n')
input++; /* read argument until next empty space */
}
*args = NULL; /* end of the argument list */
}
因为我使用的是指针,所以很难替换我想要的东西。我应该使用与上述等效的数组,还是有一个简单的解决方案?基本上,如果读取了
&
,我希望我的代码将背景
切换到1
,然后将此字符替换为\0
。有没有办法只使用指针替换字符?尽管我对strtok发表了评论,但你的语法分析器尝试得不错。注意,它不会检查您是否超出**args
的末尾
你的问题的一部分是你的问题没有很好的定义。是否要检查上一个参数的最后一个字符是否为&
?(如果是,请在参数处理结束时修复它)。还是要将&
作为终止分隔符计数,并将之前的所有内容作为一个命令计数,之后的所有内容作为另一个命令计数?在这种情况下,最好的方法是预处理字符串,将&
替换为\0
,然后调用parseArgs
,运行shell,完成后,从您想要的地方开始(因此foo&bar&baz
起作用)。然而,在一个真正的shell中,您可以做像2>&1
这样的事情作为I/O重定向。要让这样的事情正常工作,您可能最好适当地标记化。要做到这一点,yacc/lex是你的朋友
编辑-要在结尾处,即紧靠*args=NULL
之前检查&
,请执行以下操作:
int lenlast = strlen (*args);
if ((*args)[lenlast] = '&')
{
(*args)[lenlast] = '\0';
background = 1; /* declare that somewhere */
}
请使用
strtok
或更好的strtok\u r
。它不太容易出错。@a您说得很对,先生,但请注意,strtok_r()
不是标准的C语言,它主要是一个编译器扩展。@SouravGhosh不正确。这是一个POSIX函数:能否strtok
使用多个分隔符?@abligh:strtok\r
不是标准的C。您发布的链接显示:“ISO C标准的扩展。所描述的功能是ISO C标准的扩展。应用程序开发人员可以使用扩展,因为它在所有符合POSIX.1-2008标准的系统上都受支持。“我想检查&
是否是最后一个字符。我不会处理案例foo&bar&baz
。我如何在参数处理结束时检查这一点?