模拟main函数argc,argv的功能,实现通过输入命令的形式进行相应功能计算。
例如:> add 3 2
result: 3 + 2= 5
思路
我们知道main函数有三个参数,分别是argc
,argv
,envp
。
int argc
命令行输入参数(有效字符串)的个数char * argv[]
它是一个指针数组
存储每个参数(字符串)的首地址- char * envp[]
获取环境变量参数
显然本题中需要实现的是argc
,argv
这两个参数的功能。所以先定义一个函数do_arg
来实现这两个参数的功能。
do_arg
对于这个函数的参数,应该是由main提供的有一个足够长度和内容的字符数组,这样我们才能提取参数信息。
对于命令行输入的内容,用户可不会遵规守纪按照标准格式输入,每个字符串之间必然会出现不定的空格,所以在设计函数时应该考虑到这些客观因素。argv实现。
对于传输过来的字符数组,如何能有效的识别每个参数的起始地址呢?这里我们采用状态机编程思想,通过定义一个变量state
来标记字符串开始和字符串结束。1.参数字符串起始
开始遍历。判断条件应该首先满足当前地址不为空格,使用isspace()
进行判断。若条件满足,进行操作,首先将state
赋值成1表示已经记录了至少为一个字符的字符串。当再次进入判断时,state不等于1且该位置不为空格即可。
2.参数字符串结束
若当前位置为空格,那么将state
赋值成0,同时将字符数组当前位置更改为\0
,表示字符串结束。判断结束后,根据argv数组性质,将最后一个有效元素赋值为NULL
void do_arg(char* buf)
{
assert(buf);
int argc = 0;
char * argv[8] = { 0 };
int i = 0;
int state = 0;//定义状态变量,用于检测空格和字符串
for (i = 0; buf[i]; i++)//循环条件为buf为真
{
if (state == 0 && !isspace(buf[i]))//上一个字符为空格,当前字符不是空格时进入
{
state = 1;//转化状态,表示当前进入字符串。
argv[argc++] = buf+i;
}
else if (isspace(buf[i]))
{
state =