【问题标题】:Makefile C command line argumentMakefile C 命令行参数
【发布时间】:2016-02-26 04:25:20
【问题描述】:

要运行我的程序,unix 命令行是“p2 -s input.txt”

通常(没有生成文件)检查标志 == -s 我的 unix 输入是 -a.out -s input.txt,而我的 main.c 是:

int main(int argc, char argv[])
{
    if(argv[1] == "-s")
    {
        printf("The flag is -s\n");
    }
    else
    {
        printf("The flag is not -s");
    }
    return 0;
}

现在,当我使用 makefile 编写代码时,我应该更改检查标志的方式吗?还是我需要更改main.c的参数?我的makefile是:

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

【问题讨论】:

  • 我猜你应该使用strcmp(argv[1], "-s") == 0 而不是argv[1] == "-s"
  • 你的问题不清楚。为什么 makefile 会影响您编写用于解析程序命令行的代码的方式? makefile 可帮助您构建程序。然后你就可以像往常一样运行程序了。
  • 谢谢@mikeCAT。我以为我之前尝试过,我认为它给了我一个比较指针和整数的错误。谢谢您的帮助!
  • @kaylum 我一直在比较指针和整数时遇到错误,我认为 makefile 会有问题,因为我对 makefile 还是很陌生

标签: c makefile command-line-arguments


【解决方案1】:

测试

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 终止的字符序列。

另外,请注意您对main() 的定义有缺陷,正如MikeCAT 所指出的那样。

【讨论】:

  • 仔细看代码。第二个参数是char argv[],而不是char *argv[]。因此argv[1] 不是地址。
  • @MikeCAT:哎呀!我错过了。我本来希望大多数编译器也会用 main() 的隐含原型来抱怨它。
【解决方案2】:

是的,无论你是否使用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 -s\n");
    }
    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] == '\0')
    {
        printf("The flag is -s\n");
    }
    else
    {
        printf("The flag is not -s");
    }
    return 0;
}

【讨论】:

    【解决方案3】:

    命令行选项的解析是一个很好解决的问题 - 您可以使用getopt() 或 libpopt (https://directory.fsf.org/wiki/Popt)。 @MikeCAT 解释了您在字符串比较方面遇到的其他问题。

    【讨论】:

      猜你喜欢
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 2013-03-08
      • 2017-06-26
      相关资源
      最近更新 更多