(华为OJ)C 语言—中级 参数解析

本文探讨了在华为在线判断系统(OJ)中解决C语言中级问题时涉及的参数解析技术。通过具体的代码示例,阐述了如何理解和运用参数解析来解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

代码如下:

/************************************************************************
*      文件名:parameter
*      文件功能描述:参数解析
*      文件作者名:Mr_han QQ:785937095
*      说明:
*       1、参数分隔符为空格
*       2、对于用" "包含起来的参数,如果中间有空格,不能解析为多个参数。
*       3、参数不定长
*       4、输入由用例保证,不会出现不符合要求的输入
**************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LONG long
#define CHAR char
#define N    128

/*用来检索字符串后面是否有与该 " 对称的 " */
LONG Find ( CHAR buf[] )
{
    LONG i = 0;
    while ( '\0' != buf[i++] )
    {
        if ( '"' == buf[i] && ' ' == buf[i+1] )  /*限制该 " 后面必须是空格,以免在字符中间*/
            return 1;          /*有的话返回1*/
    }
    return 0;                  /*没有返回0*/
}

/*用来将几组命令符输出*/
void Print ( CHAR buf[] )
{
    LONG n, i, j;
    CHAR par[N] = "";
    n = i = j = 0;
    strcat ( buf, " " );
    while ( '\0' != buf[i] )
    {
        if ( 0 == j && '"' == buf[i] && 1 == Find ( buf + i + 1 ))   /*当 " 位于空格后的第一个字符,并且后面有与之对应的 " */
        {
            while ( '"' != buf[i+1] )
            {
                par[j] = buf[i+1];
                j++;
                i++;
            }
            par[j] = '\0';
            i+=2;
        }else
        {
            if ( ' ' != buf[i] )            /*没有 " 或只有单个 " 的时候,按空格将命令符拆分*/
            {
                par[j] = buf[i];
                j++;
            }else
            {
                par[j] = '\0';
                if ( 0 != strlen(par) )     /*避免多个空格*/
                {
                    puts(par);
                    j = 0;
                    n++;
                }
            }
            i++;
        }
    }
}

/*用来输出命令符个数,因题目要求需先输出命令符个数,故有此函数,内容与上函数相同*/
void Count ( CHAR buf[] )
{
    LONG n, i, j;
    CHAR par[N] = "";
    n = i = j = 0;
    strcat ( buf, " " );
    while ( '\0' != buf[i] )
    {
        if ( 0 == j && '"' == buf[i] && 1 == Find ( buf + i + 1 ))
        {
            while ( '"' != buf[i+1] )
            {
                par[j] = buf[i+1];
                j++;
                i++;
            }
            par[j] = '\0';
            i+=2;
        }else
        {
            if ( ' ' != buf[i] )
            {
                par[j] = buf[i];
                j++;
            }else
            {
                par[j] = '\0';
                if ( 0 != strlen(par) )
                {
                    j = 0;
                    n++;
                }
            }
            i++;
        }
    }
    printf ( "n = %d\n", n );
}

void main()
{
    CHAR buf[N] = "";
    printf ( "请输入参数并用空格间隔:" );
    gets ( buf );
    Count ( buf );
    Print ( buf );

    return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值