C Primer Plus(6) 中文版 第11章 字符串和字符串函数 11.8 命令行参数

发布于:2023-01-08 ⋅ 阅读:(170) ⋅ 点赞:(0)

11.8 命令行参数
在图形界面普及之前都使用命令行界面。Linux终端提供类UNIX命令行环境。命令行(command line)是在命令行环境中,用户为运行程序输入命令的行。假设一个文件中有一个名为fuss的程序。在UNIX环境中运行该程序的命令行是:
$ fuss
或者在Windows命令提示模式下是:
C> fuss
命令行参数(command-line argument)是同一行的附加项。如下例:
$ fuss -r Ginger
一个C程序可以读取并使用这些附加项。
repeat是一个可执行文件:
/*repeat.c*/ 
int main( int argc, char *argv[] ) 
{
    ...
}
命令行输入为:repeat I'm fine
argv[0] --- repeat
argv[1] --- I'm
argv[2] --- fine
argv --- 3个字符串
/* repeat.c -- main() with arguments */
#include <stdio.h>
int main(int argc, char *argv[])
{
    int count;
    
    printf("The command line has %d arguments:\n", argc - 1);
    for (count = 1; count < argc; count++)
        printf("%d: %s\n", count, argv[count]);
    printf("\n");
    
    return 0;

/* 输出:

*/

C编译器允许main()没有参数或者有两个参数(一些实现允许main()有更多参数,属于对标准的扩展)main()有两个参数时,第1个参数时命令行中的字符串数量。过去,这个int类型的参数被称为argc(表示参数计数(argument count)。系统用空格表示一个字符串的结束和下一个字符串的开始。因此,上面的repeat示例中包含3个字符串,其中后2个供repeat使用。该程序把命令行字符串存储在内存中,并把每个字符串的地址存储在指针数组中。而该数组的地址则被存储在main()的第2个参数中。按照惯例,这个指向指针的指针argv(表示参数值[argument value])。如果系统允许(一些操作系统不允许这样),就把程序本身的名称赋给argv[0],然后把随后的第1个字符串赋给argv[1],以此类推。
main()中的形参形式与其他带参数的函数相同。许多程序员用不同的形式声明argv: 
int main( int argc, char *argv[] )
char **argv与char *argv[]等价。也就是说,argv是一个指向指针的指针,它所指向的指针指向char。因此,即使在原始定义中,argv也是指向指针(该指针指向char)的指针。两种形式都可以使用,但我们认为第1种形式更清楚地表明argv表示一系列字符串。
顺带一提,许多环境(包括UNIX和DOS)都允许用双引号把多个单词括起来形成一个参数。例如:
repeat "I'm hungry" now
argv[1] --- I'm hungry
argv[2] --- now
11.8.1 继承环境中的命令行参数
Windows继承环境都不用命令行运行程序。有些环境中有项目对话框,为特定项目指定命令行参数。其他环境中,可以在IDE中编译程序,然后打开MS-DOS窗口在命令行模式中运行程序。但是,如果你的系统有一个运行命令行的编译器(如GCC)会更简单。
11.8.2 Mccintosh中的命令行参数 
进入Mac的Terminal模式和UNIX的命令行环境。然后,可以找到程序可执行代码的目录(UNIX的文件夹),或者下载命令行工具,使用gcc或clang编译程序。 
  

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到