要运行我的程序,unix 命令行是"p2 -s input.txt"
通常(没有makefile)要检查标志== -s,我会让我的unix输入是-a.out -s输入.txt,而我的main.c将是:
int main(int argc, char argv[])
{
if(argv[1] == "-s")
{
printf("The flag is -sn");
}
else
{
printf("The flag is not -s");
}
return 0;
}
现在,当我使用 makefile 对此进行编码时,我应该更改检查标志的方式吗?还是我需要更改 main.c 的参数?我的制作文件是:
all: p2
p2: main.o functions.o
gcc -o p2 main.o functions.o
main.o: main.c
gcc -c main.c
functions.o: functions.c
gcc -c functions.c
clean:
rm -f *.o core
测试
if(argv[1] == "-s")
不像看起来那样在 C 中工作。 C++ 经常被重载才能直观地工作,但 C 所做的是:
- 将
argv[1]
的值与"-s"
的值相等 - 第一个值是堆栈顶部附近的某个地址(从
argv[]
所在的位置开始的一个条目,由 C 运行时库或操作系统设置)。 - 秒的值是指向字符串常量的指针。
- 地址不相等,因此
if
表达式的计算结果为 0(零)。 - 所以
else
分支被拿走了。
使用 string.h 函数strcmp()
来比较给定地址的字符串。 在 C 语言中,字符串是以 ascii NUL 结尾的字符序列。
另外,请注意,正如MikeCAT所指出的那样,您对main()
的定义是有缺陷的。
是的,无论您是否使用 Makefile
,您都应该更改检查标志的方式,因为它不是标准,并且没有机会成功比较 C 中的字符串。
应使用 strcmp()
比较字符串
#include <stdio.h>
#include <string.h>
/* correct the type of second argument to the standard one, or strcmp() won't work */
int main(int argc, char *argv[])
{
if(strcmp(argv[1] "-s") == 0)
{
printf("The flag is -sn");
}
else
{
printf("The flag is not -s");
}
return 0;
}
或者,您可以手动比较每个字符,因为标志字符串很短。
#include <stdio.h>
/* correct the type of second argument to the standard one, or strcmp() won't work */
int main(int argc, char *argv[])
{
if(argv[1][0] == '-' && argv[1][1] == 's' && argv[1][2] == ' ')
{
printf("The flag is -sn");
}
else
{
printf("The flag is not -s");
}
return 0;
}
解析命令行选项是一个相当好解决的问题 - 您可以使用getopt()
或libpopt (https://directory.fsf.org/wiki/Popt)。 @MikeCAT已经解释了您在字符串比较中遇到的其他问题。