我正在尝试使用我在网上找到的以下解析功能:
void parse(char *line, char **argv)
{
while (*line != '\0') { /* if not the end of line */
while (*line == ' ' || *line == '\t' || *line == '\n')
*line++ = '\0'; /* replace white spaces with 0 */
*argv++ = line; /* save the argument position */
while (*line != '\0' && *line != ' ' && *line != '\t' &&
*line != '\n')
line++; /* skip the argument until ... */
}
*argv = '\0'; /* mark the end of argument list */
}
这对我想要做的事情很有效(制作我自己的char ** argv),但它有一个缺点。它在我的最后一个参数之后和我的NULL之前在我的argv中创建了一个额外的空字符串。你们中的任何人都可以看到我可以在哪里更改代码来修复此问题吗?我已尝试逐步使用gdb但我无法弄明白。
示例:如果我的行只是"1"
,*argv =[1, , (null)]
。我需要摆脱那个空字符串。
我已经尝试过直接更改空白区域,但这不起作用。例如,我尝试过:
char **temp = args;
int count =0;
while(*temp != NULL){
*temp = *(temp +1);
count++;}
args[count] = NULL;
答案 0 :(得分:3)
如果由line
指向的字符串,您提供的代码将在参数列表的末尾包含一个空字符串(未被很好地表征为“空空格”)以空白结束。您可以通过首先截断任何尾随空格(空格,制表符和/或换行符)来避免这种情况,方法是以避免任何可能包含此类尾随空格的方式读取*--argv = '\0'
,或者通过强制 whitespace总是将倒数第二行改为'\0'
。
虽然我正在观察它,但我观察到虽然NULL
实际上是空指针的完美有效表达式,但它远不如宏{{1}在这种情况下,简单地0
。