Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.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,我正在写一个简单的shell。我编写了一个解析器来标记命令行,将其发送到execvp。我想在解析时检查字符&,并将其替换为\0。我正在使用指针,对如何继续操作有点困惑。以下是我的解析器代码: void parseArgs(char *input, char **args, int *background) { while (*input != '\0') { while (*input == ' ' || *input == '\t' || *input == '\n'

我正在写一个简单的shell。我编写了一个解析器来标记命令行,将其发送到
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
。我如何在参数处理结束时检查这一点?