生成文件 C 命令行参数



要运行我的程序,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 所做的是:

  1. argv[1]的值与"-s"的值相等
  2. 第一个值是堆栈顶部附近的某个地址(从argv[]所在的位置开始的一个条目,由 C 运行时库或操作系统设置)。
  3. 秒的值是指向字符串常量的指针。
  4. 地址不相等,因此if表达式的计算结果为 0(零)。
  5. 所以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已经解释了您在字符串比较中遇到的其他问题。

相关内容

  • 没有找到相关文章

最新更新