指针破解(题记)C语言模拟实现命令行参数进行加减乘除运算

模拟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 = 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值