strcmp重复呼叫失败

时间:2014-05-12 00:49:20

标签: c string string-comparison

我在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");
                    }
            }

编辑:命令的重新分配导致错误。我想我需要一个三重指针。

0 个答案:

没有答案