为什么我的if / else语句没有去过别的?

时间:2017-10-06 17:25:15

标签: c if-statement

我试图编写一个从命令行接收参数(文件名)的程序。如果它不是我期望的四个文件中的一个,那么我想打印出找不到正确的文件然后安全退出。现在,当我运行我的代码时,无论参数是什么,它总是运行printf("\n\n %s \n\n", argv[1]);行。为什么会这样?

int main(int argc, char **argv)
{
    if(argv[1] == "orlando.csv" || "orlando5.csv" || "florida.csv" || 
"twolines.csv"){
        printf("\n\n %s \n\n", argv[1]);
    } else {
        printf("etl ERROR: File %s not found", argv[1]);
        return -1;
    }
}

2 个答案:

答案 0 :(得分:4)

if(argv[1] == "orlando.csv" || "orlando5.csv" || "florida.csv" || "twolines.csv")

这不符合你的想法。

首先,它测试字符串argv[1]地址是否等于字符串"orlando.csv"地址。由于一个是命令行参数而另一个是字符串文字,因此该测试将始终为false。

(具有相同地址的两个字符串也必须具有相同的内容,但具有不同地址的两个字符串可能仍具有相同的内容。)

然后它测试字符串"orlando5.csv"地址是否为" null"。字符串文字从来没有" null"地址,因此此测试将始终 true

一旦发现||测试链中的一个条目为真,就会跳过所有进一步的测试(这称为"短路评估")。

所以if-expression总是被发现是真的,if-branch总是被执行,而else-branch永远不会被执行。

你应该写的if-expression是

if (!strcmp(argv[1], "orlando.csv") ||
    !strcmp(argv[1], "orlando5.csv") ||
    !strcmp(argv[1], "florida.csv") ||
    !strcmp(argv[1], "twolines.csv"))

是的,你必须重复&#34; !strcmp(argv[1],&#34;每一次都是一部分。是的,您必须调用库函数来比较C中的字符串。(您需要将#include <string.h>添加到源文件的顶部。)

答案 1 :(得分:0)

变化:

Collections.sort(list, yourCustomComparator)

要:

if(argv[1] == "orlando.csv" || "orlando5.csv" || "florida.csv" || "twolines.csv")