C程序中的main()函数通常采用以下形式。
Int main (Int argc, const char * argv[]) {}
参数argc和argv用于读取命令行参数。这些注释将解释C中的命令行机制是如何工作的。
C语言是和UNIX操作系统一起开发的。UNIX最初是一个面向命令行的操作系统。大多数UNIX用户会通过在命令行输入文本命令来调用程序来完成工作。
UNIX命令行一个有趣的特性是,用户可以在调用程序时将参数传递给它们。例如,如果我们编写了一个C程序,编译成一个名为“foo”的程序,我们可以通过输入命令行启动该程序
/ foo。
如果程序被构造为接受来自命令行的参数,我们也可以启动程序并通过键入一些参数传递给它
./foo 123 bar
当程序启动时,它将以传递给main的文本字符串数组的形式接收额外的命令行参数。
正如您在上面看到的,main有两个参数。第一个参数argc是一个整数计数,表示用户在调用程序时键入了多少命令行参数。第二个参数argv是一个包含用户键入的实际参数的文本字符串数组。程序本身的名称始终被视为第一个参数,其他参数作为数组中的后续条目存储。
例如,如果用户通过输入
./foo 123 bar
在命令行中,main将接收一个值为3的argc参数和一个包含三个文本字符串“”的argv参数。/foo“, “123”和”bar"。程序可以通过使用sscanf函数扫描字符串的内容,从字符串数组中提取有用的信息。例如,要将参数“123”转换为整数,程序将这样做
int x; sscanf(argv[1],"%d",&x);
下面是一个示例程序的代码,它使用了几个命令行参数。
#include <stdio.h> int main (int argc, const char * argv[]) {int x, N, N;//用户将通过命令行参数传递给我们一个种子值和一个N值。由于//程序的名称总是第一个参数,所以检查//是否有3个参数。如果我们看到//除了3个参数之外的任何东西,就退出并返回一个错误消息。if(argc != 3) {printf(“无效参数列表。\n”);printf("Usage: Random <seed> <N>\ N ");返回1;} //从参数sscanf(argv[1],"%d",&x)中读取x和N;sscanf (argv[2],“% d n);N = 0;while(n < n){//生成数列中的下一个数字//按11657 Mod以使数字保持在//适度范围内。X = (17389* X +12553)%11657;n + +;//打印刚刚生成的数字。//因为我们想要打印0到999范围内的数字,所以我们必须对x //取1000的模来得到想要的值。printf (" % d \ n”,x % 1000);}返回0;}
这个程序生成一个伪随机的整数序列,并将其打印到控制台。序列的种子值或起始值以及要生成的数字数量都作为命令行参数传递给程序。在main的顶部附近,程序扫描这些参数并使用它们为接下来的内容设置逻辑。
假设上面示例程序的代码存储在名为random.c的c源代码文件中。要从命令行编译这个程序,我们可以使用下面的命令
c - 0随机
这里使用的-o选项允许我们指定编译random.c时生成的可执行文件的名称。
一旦我们编译了程序,我们就可以通过输入来运行它
./random 392
这将导致程序从种子值392开始生成10个随机整数。
命令行上的程序常用的另一种技术是重定向。在这种技术中,您可以重定向程序的输入或输出流。例如,您可以将程序的标准输出重定向到文件。
要运行随机数生成程序并将输出重定向到名为“random.txt”的文件,我们可以这样做
./random 102 100 > random.txt
您还可以使用重定向来强制程序从文件而不是键盘中获取输入。我将在下面展示一个示例。
从命令行读取参数并将输出输出到控制台的命令行程序是Unix生态系统的重要组成部分。Unix用户使用这类程序的一个常见技巧是将几个短程序组合在一起。
管道的一个常见赢博体育是将输出从一个程序发送到另一个程序以进行进一步处理。通常,第二个程序是标准的Unix命令行实用程序之一,它将对第一个程序的输出执行额外的处理。这里有一个典型的例子。假设我们想要运行随机数生成器,只查看它输出的以数字5开头的数字。我们可以通过将随机程序的输出管道输出到Unix grep实用程序来实现这一点。Grep是一个实用程序,它扫描输入文本的行来寻找模式。在下面的示例中,我告诉grep扫描随机程序生成的输出,查找以数字5开头的行。
./random 120 30 | grep ^5
您可以使用此技术将自己的两个或多个程序链接在一起。我上面写的随机数生成程序可以作为一个方便的随机数流源,它可以通过管道传递给其他程序。下面是一个程序的源代码,该程序执行一个简单的蒙特卡罗模拟示例,该示例使用随机数流来模拟一个简单的物理过程。在这种情况下,这个过程是模拟在飞镖板上随机投掷飞镖。飞镖板是一个圆,其半径R由命令行参数给定。该程序从键盘上读取N对整数来模拟投掷到飞镖板上的N个飞镖。飞镖板位于原点,并适合边长为2 R的正方形。通过计算落在原点R内的飞镖数量,我们可以对π进行粗略的估计。
#include <stdio.h> int main (int argc, const char * argv[]) {int R, N, N, inccircle, x, y;//用户将通过命令行参数传递给我们一个半径R和一个N的值。由于//程序的名称总是第一个参数,所以检查//是否有3个参数。如果我们看到//除了3个参数之外的任何东西,就退出并返回一个错误消息。if(argc != 3) {printf(“无效参数列表。\n”);printf("Usage: parts <R> <N>\ N ");返回1;} //从参数sscanf(argv[1],"%d",&R)中读取R和N;sscanf (argv[2],“% d n);N = 0;inccircle = 0;while(n < n){//读取下一个dart的坐标scanf("%d",&x);scanf(“% d”,y);//重新调整点的中心,使其落在正方形中。x = x%(2*R)-R;y = y%(2*R)-R;//镖是否在原点的R内?if(x*x+y*y <= R*R) incirle++;n + +;} //比率inccircle /N将产生Pi/4的估计值。//通过乘以4.0,我们可以得到一个粗略的估计值。printf (" % f \ n”,4.0 *内切圆/ n);返回0;}
如果我们将这段代码编译成一个名为darts的程序,我们可以将随机程序的输出输出管道到darts程序中,以获得π的估定值:
./random 120 1000 | ./darts 500 500
我们也可以使用重定向技术将Random程序的输出重定向到一个文件,然后将该文件重定向到dart程序的输入:
./random 120 1000 > random.txt ./darts 500 500 < random.txt ./
作为编译这些程序的另一种选择,我们可以使用make系统来构建程序。Linux的make实用程序可以很容易地在一个项目中编译一个或多个文件。
使用make的第一步是创建一个make文件。makefile是一个名为“makefile”的文本文件,您可以将其放在与源代码文件相同的目录中。
下面是我们项目的makefile:
赢博体育:随机镖随机:random.c GCC random.c -o随机镖:dart .c GCC dart .c -o镖测试:随机镖./random 932 1000 > random.txt ./darts 500 500 < random.txt
makefile是一个或多个目标的列表。每个目标都有表单
<目标名称>:<依赖项> <构建命令>
例如,构建随机程序的目标是
GCC Random .c -o Random
这表示目标随机依赖于C源代码文件random. C。每当源代码文件被修改时,当我们运行make命令时,make系统将自动重新编译随机程序。
一旦我们设置了makefile,我们就可以通过简单地输入命令来重建项目中的赢博体育程序
使
在终点站。当您以这种方式运行make时,它会在当前目录中查找名为Makefile的文件,并尝试构建其中列出的第一个目标。在本例中,第一个目标是all目标,它又依赖于随机目标和飞镖目标。如果需要重新编译这些文件中的任何一个,make将运行列出的命令来重新编译它们。
示例make文件还包含一个测试目标,如果进行了任何更改,它将重新编译程序,然后运行两个简单的测试来测试这两个程序。要执行这个目标,我们运行命令
做测试
在终点站。