【问题标题】:C - Using argv for commandsC - 使用 argv 命令
【发布时间】:2014-03-29 17:07:59
【问题描述】:

目前我正在实现一个简单的二叉搜索树并添加、删除、搜索或任何我想要的命令,我想在命令行中输入它然后执行该功能。

所以下面的代码会将整数 6 插入到二叉树中,看看它是否被添加“然后删除它。然后继续遍历树后序。(添加它是为了表明它不仅仅是字符串和整数需要实现的——作为参考)

"insert" 6 
"search" 6
"delete" 6
"traverse" "post"

不幸的是,当我试图确定在与 arg 相关时调用哪个函数时,我不断收到指针和整数之间的比较警告

int main(int c, char *argv[2]) {

typedef struct node {
    int value;
    struct node * left;
    struct node * right;
}  * node;

    /* This is irrelevant and the function is in a different file */
createNode(1);
createNode(2);
createNode(3);
createNode(4);
createNode(5);
createNode(6);
createNode(7);
createNode(8);

    /* comparison warnings when deciding WHICH method to call based on the command given */
if (argv[0] == "quit") quit();
if (argv[0] == "insert") insert(argv[1]);
if (argv[0] == "delete") delete(argv[1]); 
if (argv[0] == "search") search(argv[1]);
if (argv[0] == "empty") empty();  

}

【问题讨论】:

  • 你不能在 C 中使用 "asdf"=="asdf" 进行字符串比较,你必须使用 strcmp()

标签: c binary-search-tree argv


【解决方案1】:

注意参数定义:

char *argv[]

其内容为:“argv 是指向 char 的指针数组。因此,argv[0] 的类型为 char *,而 q 的类型为 char。基本上,您是在比较一个字符用一个字符串。

你可以用strcmp比较字符串,如果字符串相等则返回0:

    if(strcmp(argv[0], "quit") == 0)
        ...

另外,argv[0] 通常包含您的程序的名称。第一个参数存储在argv[1]

编辑:我发誓我在某处看到了argv[0]=='q'...答案的第一部分在编辑后无关紧要。

【讨论】:

    【解决方案2】:

    main()的原型通常是

    int main(int argc, char *argv[])
    

    第一个参数,即argv[0],是您的程序的名称,argv[1] 是您在命令行中为程序提供的第一个参数。

    并且要比较两个字符串,您应该使用<string.h> 中的strcmp() 而不是==,这是您在问题中提到的警告的原因。因为argv[0]argv[1] 是指向char 的指针,而'q'char(它会自动转换为int)。

    因此,您应该在代码中使用类似以下的内容:

    int main(int argc, char *argv[]) {
        ...
    
        if (strcmp(argv[1], "quit") == 0) quit();
    

    【讨论】:

      【解决方案3】:

      main() 通常声明为

      int main( int argc, char *argv[] )
      

      argc 表示用户输入了多少命令行参数,因此argv 数组中有多少有效指针。 argv 数组中的第一个指针通常是程序的名称或程序的完整路径。

      在使用argv 中的指针之前,您应该始终检查argc。如果代码要求用户在命令名称后输入 2 个参数,则代码应检查 argc == 3 并应打印 usage 消息并在 argc 不是 3 时退出。

      对于问题中列出的程序,预期的参数是

      argv[0]   name or path of the program
      argv[1]   command: "quit", "insert", etc.
      argv[2]   additional argument for the command
      

      但最后两个只能在argc == 3时使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-15
        • 2018-01-07
        • 2014-06-02
        • 2011-05-05
        • 2011-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多