Linux C程序命令行传参

    在命令行环境下,执行已编译的程序时,将命令行参数以同一行的附加参数的形式传入到要执行的程序中。C编译器允许main()函数没有参数,或者有两个参数(也有可能更多,是对标准的扩展)。一般形式为“int main(int argv;char* argv[])”,其中第一个参数argc代表命令行中字符串个数(系统以空格作为一个字符串结束的标志);第二个参数*argv[]是一个字符指针组成的数组或者是一个指向字符串的指针数组,命令行的每一个字符串被存储到内存中,并且分配一个指针指向它,这些指针即构成第二个参数。

编写一个程序:

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[]){
    int i,times,count;
    if(argc < 2)
        printf("Note : %s should follow your name and a positive-number\n",argv[0]);
    else if(argc < 3 || (times = atoi(argv[2])) < 1)
        printf("Note : %s %s should follow a positive-number\n",argv[0],argv[1]);
    else
    	printf("Implementation success!\n");
        for(i = 0; i < times; i++){
            printf("Hello, %s!\n",argv[1]);
        }
    return 0;

编译并执行:

600*400

    在这个简单的程序中,虽然以数字作为命令行附加参数,但是程序执行时这些参数是以字符串的形式存储的,因此用到了C标准库函数atio(),它是以字符串作为参数,返回相应的整数值,即完成字符串到整数的转换。需要注意的是,字符串若是以整数开头,但整数之后跟有其他字符,atio()函数仍然可以正常返回之前读取的整数值。但是字符串中不是以整数开头(字符串中无整数以及字符串中有整数但不是位于开头位置),函数则返回一个0。

  接下来,我们利用命令行传入参数的方法,进行文件操作实例。创建一个新的文件fupenzi.txt。代码文件create_file.c如下:

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

int main(int argc,char* argv[]){
	char name[40];
	FILE *new_file;
	strcpy(name,argv[1]); //拷贝传入的第一个字符串到定义的数组中,限定传入字符串长度为39,该字符串将作为文件名;
	new_file = fopen(name,"w"); //打开以命令行参数命名的文件并清空内容,若是不存在该文件则重新建立之;
	fclose(new_file);//关闭文件;
	return 0;
}

执行结果:

 

C程序中也经常需要命令行传参,常见于Linux C/C++应用软件,写一个典型的命令行参数解析demo,对命令行的参数进行解析后执行相关操作。

#include <ctime>
#include <string>

using namespace std;

string inFile, outPath, fileName;
float fileSize;


void soft_tag()
{
	time_t raw_time;
	struct tm *time_info;
	
	time(&raw_time);
	time_info = localtime(&raw_time);
	cout << "[Info]" << __DATE__ << __TIME__ << endl;
	cout << "[time]" << actime(time_info);
}

void print_help_info()
{
	cout << "parameter description:" << endl;
	cout << "-i " << "input file." << endl;
	cout << "-o " << "output path of file." << endl;
	cout << "-m " << "name of file." << endl;
	cout << "-s " << "size of file." << endl;
	cout << "-h " << "print help info." << endl;
}

int parse_cmd_args(int argc, char * argv[], int *para_in, int *para_out, int *para_main, int *para_size)
{
	enum para_state {PARA_NON, PARA_IN, PARA_OUT, PARA_MAIN, PARA_SIZE};
	int is_state = PARA_NON;
	
	for (int i = 1; i < argc; ++ i)
	{
		string paraWord(argv[i]);
		int flg = 1;

		if (0 == paraWord.compare("-h"))
		{
			print_help_info();
			exit(0);
		}

		if (0 == paraWord.compare("-m"))
			is_state = PARA_MAIN;
		else if (0 == paraWord.compare("-i"))
			is_state = PARA_IN;
		else if (0 == paraWord.compare("-o"))
			is_state = PARA_OUT;
		else if (0 == paraWord.compare("-s"))
			is_state = PARA_SIZE;
		else
			flg = 0;
			
		if (flg) continue;
		
		switch(is_state)
		{
			case PARA_IN :
				if (0 == access(argv[i], 0))
				{
					*para_in = 1;
					inFile.assign(argv[i]);
				}
				break;
			case PARA_OUT :
				*para_out = 1;
				outPath.assign(argv[i]);
				break;
			case PARA_MAIN :
				*para_main = 1;
				fileName.assign(argv[i]);
				break;
			case PARA_SIZE :
				*para_size = 1;
				fileSize = atof(argv[i]);
				break;
			default:
				break;
		}
		
		return 0;
	}
	

int main(int argc, char *argv[])
{
	soft_tag();
	
	int para_in = 0, para_out = 0, para_main = 0, para_size = 0;
	parse_cmd_args(argc, argv, para_in, para_out, para_main);
	
	if (para_in)
		cout << "input file: " << inFile << endl;
	
	if (para_out)
		cout << "output path: " << outPath << endl;
		
	if (para_main)
		cout << "file name: " << fileName << endl;
		
	if (para_size)
		cout << "file size: " << fileSize << endl;
	
	return 0;
}

  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值