在C中比较多个字符串的最佳方法是什么?

时间:2018-11-26 20:32:03

标签: c string strcmp

我正在尝试找到比较C语言中多个字符串的最佳方法。 目前,我正在使用strcmp();函数,但事实证明它太多了if 陈述。我也使用三元运算符,但不幸的是,它没有帮助。 有更好的解决方案吗? 这是示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char command[] = "First Second Third";
    char * del = " ";
    char * token;
    char * strings[3];
    int n = 0;
    token = strtok(command, del);

    while (token != NULL){

        strings[n] = token;
        token = strtok(NULL, del);
        n++;
    }
    // Now, strings[0] = "First", strings[1] = "Second", and strings[2] = "Third"

    // Only examine strings[1] and strings[2] after we know strings[0] = "First".
    if (strcmp("First", strings[0]) == 0){
        //do something
        if (strcmp("Second", strings[1]) == 0){
            //do something
            if (strcmp("Third", strings[2]) == 0){
                //do something
                printf("CORRECT");
                //do something
            }
        }
    }

    return 0;
}

2 个答案:

答案 0 :(得分:1)

OP的代码有问题

  • while (token != NULL)对3个循环没有限制。代码可能会尝试strings[3] = token;

    // while (token != NULL){
    while (n < 3 && token != NULL){
    
  • 代码使用strings[0]strings[1]strings[2]而不先确保解析了许多令牌。

    // strcmp("First", strings[0]) == 0
    (n > 0 && strcmp("First", strings[0]) == 0)
    
  • 代码将指针保存到原始字符串。再次调用strtok()后,先前的令牌可能会丢失/更改。


“最佳”方式涉及散列键和目标,但这在这里有很多解释。

替代方法:使用OP示例中所需的简单匹配,代码可以使用"%n"来记录扫描的偏移量。

int n1 = 0, n2 = 0, n3 = 0;
sscanf(command, "First %n Second %n Third %n", &n1, &n2, &n3);

if (n1) {      // n1 is non-zero if scan matched "First"
    //do something
    if (n2) {  // n2 is non-zero if scan matched "First Second"
        //do something
        if (n3) {
            //do something
            printf("CORRECT");
            //do something
        }
    }
}

答案 1 :(得分:0)

您的if语句似乎应该使用strcmp()而不是发布的strtok()。另外,我认为您正在寻找更像if ... else if ... else if ...的东西,而不是嵌套的if's

根据您正在编写的实际程序(相对于发布的),您还可以根据字符串中的第一个字符使用switch()进行比较。它相当于一个粗略的哈希函数。 (您可能想了解有关散列的更多信息,以使所需的内容适应所需的内容。)


编辑: 也许这就是您得到的: 。 。

    if (strcmp(strings[0], "cmdA") == 0)
        processCmdA(strings[1], strings[2]);
    else
    if (strcmp(strings[0], "cmdB") == 0)
        processCmdB(strings[1], strings[2]);
    else
    if (strcmp(strings[0], "cmdC") == 0)
        processCmdC(strings[1], strings[2]);
.
.
.
void processCmdA(char* optionA, char* inputFileName)
{
    if (strcmp(optionA, "parse") == 0)
        parseFile(inputFileName);
    else
    if (strcmp(optionA, "cksum") == 0)
        computeCheckSum(inputFileName);
    else
.
.
.
}

void parseFile(char* inputFileName)
{
    // do parse stuff
}
.
.
.