c语言环境中,可以在程序开始执行时将命令行参数传递给程序。main函数有两个参数。
- argc:表示运行程序时命令行中参数的数目。
- argv:参数向量,是一个指向字符串数组的指针,其中每个字符串对应一个参数。
- arg[0]的值是启动程序的程序名(c语言的规定,由此可知,argc的值至少是1),当argc的值为1时,说明程序名后面没有命令行参数。
- ANSI标准要求argv[argc]的值必须为一空指针。
echo hello world
上面例子中,argc的值为3,argv[0],argv[1],argv[2]的值分别是”echo”、”hello”、”world”。
#include <stdio.h>
int main(int argc,char*argv[]){
int i;
for(i = 1; i < argc; i++){
printf("%s%s",argv[i],(i < argc - i) ? " " : "");
}
printf("\n");
return 0;
}
另一种形式:
#include <stdio.h>
int main(int argc,char*argv[]){
while (--argc > 0){
printf("%s%s",*++argv, (argc > 1) ? " " : "");
}
printf("\n");
return 0;
}
打印与第一个参数
#include <stdio.h>
#include <string.h>
#define MAXLINE 1000
int getlines(char *line, int max);
int main(int argc, char *argv[]){
char line[MAXLINE];
int found = 0;
if(argc != 2)
printf("Usage: find pattern\n");
else
while (getlines(line,MAXLINE) > 0)
if (strstr(line,argv[1]) != NULL){//strstr(s,t)返回一个指针,该指针指向字符串t在字符串s中第一次出现的位置。
printf("%s",line);
found++;
}
return found;
}
int getlines(char s[],int lim){
int c,i;
for(i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
s[i] = c;
if(c=='\n'){
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
上面程序(输入的字符串如果包含ss就打印出来)运行结果如下:
UNIX系统中的c语言程序有一个公共的约定:以负号开头的参数表示一个可选标志或参数。
上述程序改造:
#include <stdio.h>
#include <string.h>
#define MAXLINE 1000
int getlines(char *line, int max);
int main(int argc, char *argv[]){
char line[MAXLINE];
long lineno = 0;
int c,except = 0, number = 0,found = 0;
while (--argc > 0 && (*++argv)[0] == '-'){
while (c = *++argv[0])
switch (c){
case 'x':
except = 1;
break;
case 'n':
number = 1;
break;
default:
printf("find: illegal option %c\n",c);
argc = 0;
found = -1;
break;
}
while (getlines(line,MAXLINE) > 0){
lineno++;
if((strstr(line,argv[1]) != NULL) != except){
if(number)
printf("%ld:",lineno);
printf("%s",line);
found++;
}
}
}
return found;
}
int getlines(char s[],int lim){
int c,i;
for(i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
s[i] = c;
if(c=='\n'){
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
上面程序是在查找除了指定字符串以外的字符串,并且加上行号打印。
下面是标注行号打印不包含ss的字符串。