我在C中编写一个简单的shell程序,它添加了一些内部命令,如果输入不是其中之一,则会执行标准命令。当我使用strcmp将我的输入与各种命令进行比较时,它会在重复使用时失败。我认为我的解析算法有问题,因为比较非常简单,但只能在重复的不带引号的命令上失败。解析输入以将引用的字符串保持在一起,否则用空格分隔。标准中的注释是单引号和双引号不会嵌套。
此方法的参数是使用getline和0的stdin输入。
char** strparse(char* str, int* size)
{
char** array = NULL;
char* temp = strdupa(str);
char* delimquotes = "\"\'";
char* token = NULL;
bool inquote = temp[0] == '\'' || temp[0] == '"';
*size = 0;
while ((token = strsep(&temp, delimquotes)))
{
if(!strlen(token))
{
continue;
}
if (inquote)
{
(*size)++;
array = realloc(array, (*size) * sizeof(char*));
if (array)
{
array[(*size)-1] = token;
}
else
{
free(array);
free(temp);
free(token);
return NULL;
}
}
else
{
char* temp2 = strdupa(token);
char* delimspace = " ";
char* token2 = NULL;
while ((token2 = strsep(&temp2, delimspace)))
{
if(!strlen(token2))
{
continue;
}
(*size)++;
array = realloc(array, (*size) * sizeof(char*));
if (array)
{
array[(*size)-1] = token2;
}
else
{
free(array);
free(temp);
free(temp2);
free(token);
free(token2);
return NULL;
}
}
}
inquote = !inquote;
}
return array;
}
在索引0处测试返回的数组将为后续命令返回完全相同的内容。我完全混淆了为什么这只适用于引用输入。
编辑:使用printf("-%d-%s-\n", i, parsed[i]);
检查输出,在工作和非工作情况下没有尾随或前导空格。
EDIT2:strcmp部分。
char** parsed = strparse(line, &size);
if (size <= 0)
{
commandcount--;
free(line);
free(parsed);
continue;
}
else
{
for(int i = 0; i < size; i++)
{
printf("-%d-%s-\n", i, parsed[i]);
}
commands = realloc(commands, commandcount * sizeof(char*));
commands[commandcount-1] = line;
if (!strcmp(parsed[0], "verbose"))
{
verbose(size, parsed);
}
else if (!strcmp(parsed[0], "help"))
{
help(size, parsed);
}
else if (!strcmp(parsed[0], "history"))
{
history(size, parsed);
}
else if (!strcmp(parsed[0], "quit"))
{
quit(size, parsed);
}
else
{
printf("NO MATCH\n");
}
}
编辑:命令的重新分配导致错误。我想我需要一个三重指针。