gpt4 book ai didi

c - 为什么我的 if/else 语句永远不会转到 else ?

转载 作者:行者123 更新时间:2023-11-30 20:48:08 25 4
gpt4 key购买 nike

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

最佳答案

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

这并不像你想象的那样。

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

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

然后它测试字符串 "orlando5.csv"地址是否不为“null”。字符串文字永远不会有“空”地址,因此此测试将始终为true

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

所以 if 表达式总是被发现为 true,并且 if 分支总是被执行,而 else 分支永远不会被执行。

您应该编写的 if 表达式是

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

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

关于c - 为什么我的 if/else 语句永远不会转到 else ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46610976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com