我试图编写一个从命令行接收参数(文件名)的程序。如果它不是我期望的四个文件中的一个,那么我想打印出找不到正确的文件然后安全退出。现在,当我运行我的代码时,无论参数是什么,它总是运行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;
}
}
答案 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"))
是的,你必须重复" !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")