我正在尝试找到比较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;
}
答案 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
}
.
.
.