【问题标题】:What is the definition of an "argument in C"“C中的参数”的定义是什么
【发布时间】:2020-05-14 01:19:29
【问题描述】:

我在阅读一行代码以及理解这行代码上下文中的参数构成时遇到了一些问题。这保存在一个名为argv0.c的文件中

#include <cs50.h>
#include <stdio.h>

int main(int argc, string argv[])
{
    if (argc == 2)
    {
        printf("hello, %s\n", argv[1]);
    }
    else
    {
        printf("hello, world\n");
    }
}

我编译代码如下:

make argv0
./argv0

接下来会提示我输入。这就是问题所在:

  1. 如果我在终端中输入“Dion Lim”,Dion Lim 是否被视为参数?如果是,是两个参数吗?

  2. 为什么我在终端输入“Dion Lim”得到“Hello, World”,但输入“Dion”却得到“Hello,Dion”

【问题讨论】:

标签: c startup argv cs50 argc


【解决方案1】:

Q1) 是的,它们是两个参数。

Q2) 因为argc 考虑可执行文件的名称,所以它是第一个参数。所以:

./argv0 Dion Lim // argc == 3
./argv0 Diom     // argc == 2
./argv0          // argc == 1

您可以获取更多详细信息here

【讨论】:

    【解决方案2】:

    如果我在终端输入“Dion Lim”,Dion Lim 是否被视为 争论?如果是,是两个参数吗?

    这当然取决于你的 shell 如何处理它,但通常"Dion Lim" 是一个参数,而Dion Lim(不带引号)是两个参数。空格分隔参数,如果您想在输入中使用空格(有时您也可以转义空格,例如Dion\ Lim),可以使用引号解决此问题。

    为什么如果我在终端输入“Dion Lim”,我会得到“你好, World”,但如果我输入“Dion”,我会得到“Hello,Dion”

    argc 参数告诉您有多少个参数(我认为它代表“参数计数”)。程序的名称也算作一个参数,所以如果你只传递Dion,那么argc 将是2。如果你通过Dion Lim,它将是3

    【讨论】:

    • 嘿 Blaze,如果我可以问后续问题。在 arg c 之前加上 int 的目的是什么(即“int arg c”)?
    • @LimDion 对于这类问题,您真的应该阅读基本教程; int 是函数main 的名为argc 的参数的类型
    【解决方案3】:

    要查看参数的数量,请检查值argc(参数计数)。始终至少有一个输入参数,即程序名称。

    所以./argv0 Dion Lim 有三个输入参数。

    如果您想知道make 使用Makefile 编译程序,那么如果查看您正在运行make 的目录,您会发现一个名为Makefile 的文件包含编译说明。

    【讨论】:

      【解决方案4】:

      根据C标准(5.1.2.2.1程序启动)

      ——如果argc的值大于零,指向的字符串 by argv[0] 代表程序名; argv[0][0] 应为空 如果程序名称不能从主机获得,则为字符 环境。如果 argc 的值大于 1,则字符串 argv[1] 到 argv[argc-1] 所指向的代表程序 参数。

      因此,如果您“手动”提供参数Dion,那么argc 将完全等于 2。第一个程序参数将是程序名称(因为它从引号后面),第二个程序参数将成为Dion这个词。

      如果您输入Dion Lim,那么主机系统会将它们视为两个程序参数,并且加上程序名称argc 将等于3

      但是,如果您将输入 Dion Lim 括在括号中,例如 "Dion Lim",那么系统会将输入视为一个参数,您的程序将输出

      hello Dion Lim
      

      【讨论】:

        猜你喜欢
        • 2015-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-14
        • 1970-01-01
        • 2018-04-28
        • 2015-02-14
        • 1970-01-01
        相关资源
        最近更新 更多