【问题标题】:C - main() command line parametersC - main() 命令行参数
【发布时间】:2013-12-26 03:02:02
【问题描述】:

这是一个非常基本的问题,但我无法在任何地方找到明确的答案。 我理解 main 的参数,就它们所指的而言:

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

其中 argc 指的是命令行参数的数量,而 argv 指的是保存每个字符串的数组。我从 .c 文件创建了源代码的 exe 文件,但没有使用命令提示符的经验,也不懂命令行参数的语法。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main(int argc, char *argv[])
{
    FILE *infile, *outfile;
    int iochar;

    if(argc != 3){
        printf("Usage: filename infile outfile\n");
        exit(1);
    }

    if((infile = fopen(argv[1], "r")) == NULL){
        printf("Can't open input file.\n");
        exit(1);
    }

    if((outfile = fopen(argv[2], "w")) == NULL){
        printf("Can't open output file.\n");
        exit(1);
    }

    while((iochar = getc(infile))!=EOF){
        putc(iochar, outfile);
    }

    fclose(infile);
    fclose(outfile);

    printf("You've reached the end of the program.\n"); 

    return;
}

前面的代码应该接受 3 个参数并将第二个参数的内容复制到第三个参数的位置。我该怎么做才能发生这种情况?

【问题讨论】:

  • 您似乎在这里问了两个问题,这两个问题似乎并不相关。第一个 - “每个参数存储在哪里” - 没有任何意义。它们作为参数提供给函数main()
  • 要了解这里发生了什么,首先在if(argc != 3) 行设置断点,然后检查argcargv 的内容。
  • @sudowned 我想更好的措辞是如何将参数提供给命令提示符?我似乎永远无法到达命令提示符接受任何输入的地步。
  • 您不执行或运行 .c 文件。那是你的源代码。您需要先将其编译成可执行文件。
  • printf("Can't open input file.\n"); 是无用错误消息的典型示例。哪个文件?为什么打不开?为什么将错误消息打印到 stdout 而不是 stderr?用perror( argv[1] ) 替换那行可怕的代码,并对所有其他错误消息进行类似的替换。

标签: c command-line parameters main


【解决方案1】:

您可以在 VS 项目的 Debug 属性中设置命令行参数。

不懂命令行参数的语法。

命令行参数的语法细节取决于解释它们的程序......VS,Windows快捷方式,Windows cmd,bash等......但通常它只是一个由空格分隔的项目列表.如果项目本身包含空格、引号或其他特殊字符,则需要注意所使用的解释器的规则。

命令行参数的语义由你的程序定义......在这种情况下,第一个参数是输入文件的名称,第二个参数是输出文件的名称。

printf("Usage: filename infile outfile\n");

这不是一个很好的用法消息...“文件名”应该是您的程序的名称,通常是 argv[0] 的值。因此:

printf("Usage: %s infile outfile\n", argv[0]);

【讨论】:

  • 所以从技术上讲,第一个参数是程序位置之后的短语?还是程序的位置被认为是第一个参数?
  • @Aleyha 前者。第一个参数是 infile,第二个参数是 outfile。虽然程序路径在 argv (argv[0]) 中,但它不被视为或称为参数。
  • @Aleyha 是的,argc 是 argv 中的元素数,不包括终止的 NULL。在您的情况下,argc 将是 3。
  • 最后一个问题,抱歉打扰。我试图将解决方案资源管理器 -> 属性 -> 调试 -> 命令参数设置为 3(或者如果这就是 VS 2012 解释参数的方式,则为 2?)。不过,这仍然没有为我显示命令提示符。设置项目的调试属性的命令行是不是还有别的意思?
  • @Aleyha 您需要 2 个参数——实际参数,而不是数字。然后按 F5,你的程序应该运行,复制文件,然后退出......不会有任何命令提示符。您可以在程序的开头设置一个断点(双击第一个 if 语句的边距,您应该会看到一个红色圆圈),它会停在那里,您可以单步执行程序。我强烈建议您阅读 VS 帮助以熟悉它——它非常强大,以后会对您有所帮助。 (注意:我主要在 VS 中处理 GUI 程序,而不是控制台应用程序,所以我这里的 cmets 可能有点偏离。)