镜缘浮影 小人本住在 苏州的城外 家里有屋又有田 生活乐无边

那些年我们一起忘掉的C (十九).main函数传参

2016-11-25
wilmosfang
c
原文地址 http://soft.dog/2016/11/25/c-basic-19/

前言

C语言中虽然所有函数都是平行的,但是main函数还是有些特殊,它可以调用其它函数,但是不能被其它函数所调用,那如何调用main函数呢,可以通过命令行给main函数传参


概要


给main函数传参

写一个简单的加法运算器,从命令行中接受多个数值,运行后反馈它们的加和结果

int main(int argc,char *argv[])
{
.....
}

./m 12 23 .. ...求和 35

代码注解

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

int mi(int n) //定义一个根据数位反馈权值的函数,接受一个整型位数n,反馈幂值
{
	return (n==1)?1:10*mi(n-1); //反馈10的n-1次方作为权值
}

int checkarg(int n,char *parg[]) //定义一个检查参数的函数,用来确认main函数获取到的参数的合法性,接受一个整型数值和一个字符型指针数组
{
	int i; //定义一个整型变量进行循环控制
	char *p; 
	for(i=0;i<n;i++) printf("%s\n",parg[i]); //遍历所有参数并且打印,这一步是不是必要的,只是为了进行回显确认,注意,程序名也算参数中的一个,是第0号参数
	for(i=n-1;i>0;i--) //整型变量i赋初值n-1,在[n-1,1]的范围里,逐一自减进行遍历
	{
		for(p=parg[i];*p != '\0';p++) //获取一个参数字符串的首地址,然后对参数字符串进行遍历
		{
			if( *p < '0' || *p > '9') //如果出现数字字符以外的字符,就提示异常,并且退出
			{
				printf ("please reinput the number, error number %c\n",*p);
				return 0; //异常则反馈0
			}
		}
	}
	return 1; //到最后也没找到非法字符,则返回1
}

int addarg(int n,char *parg[]) //定义一个计算和的函数,接受一个整型数值和一个字符型指针数组
{
	int i,len=0,sum=0; //定义三个整型变量,i用来进行循环控制,len用来保存权重,sum用来存放累计和
	char *p;
	for(i=n-1;i>0;i--) //整型变量i赋初值n-1,在[n-1,1]的范围里,逐一自减进行遍历,在数组中对应第二个参数到最后一个参数
	{
		for(len=strlen(parg[i]),p=parg[i];*p != '\0';p++,len--) sum+= (*p-'0') * mi(len); //逐一遍历参数中的字符,转化为数值后加上权重累计到sum中进行保存
	}
	return sum; //将sum值返回
}

int main(int argc,char *argv[]) //带参数的main函数,接受一个整型数值和一个字符型指针数组,编译完成后可以直接在命令中进行使用,如 ./x.exe 12 34,在命令行中,它程序接收的其实是字符串,而非数值,这个从字符串到数值的转换需要我在代码中完成
{
	int sum=0;
	if (checkarg(argc,argv) ==0 ) return 0;  //调用checkarg对参数进行检查
	sum=addarg(argc,argv); //调用addarg进行计算
	printf("\nthe sum is: %d\n",sum);
	return sum;
}

思路

首先检查传进来的参数是否合法,然后想办法将参数字符串转化为对应的数值,最后对数值进行累加

基础知识点

  • 指针数组的用法
  • 指针数组作为main函数的形参
原文地址 http://soft.dog/2016/11/25/c-basic-19/

评论