命令参数处理

命令参数处理

在很多时候我们都会写一下带有命令及其参数处理的程序。比如说在模拟shell的实验中,处理我们输入的各种命令,输入"ls -al *.c", 结果应该是输出当前目录下的所有.c文件的详细信息。我们需要做到就是提取出这段字符串中的有用信息,人们都能想到的一种做法是遍历一遍字符串,去掉空白字符,将有用的命令和参数存入相应的位置,问题很简单关键就是看你这里怎么写。
当然类似的问题也可以使用正则表达式来做,但这不是这里要说的内容。这里要说的是我在阅读pachi源码中发现作者使用的一种方法。

代码

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

int main () {
    #define next_tok(to_) \
	to_ = next; \
	next = next + strcspn(next, " \t\r\n"); \
	if (*next) { \
		*next = 0; next++; \
		next += strspn(next, " \t\r\n"); \
	}
    char str[100] = "bb     19     he"; 
    char *cmd, *next = str;
    next_tok(cmd);
    printf("%s\n", cmd);
    next_tok(cmd);
    printf("%s\n", cmd);
    next_tok(cmd);
    printf("%s\n", cmd);
    #undef next_tork
    return 0;
}
输出结果为:
bb
19
he

其中有两个函数 strcspn() 和 strspn() 百度说明如下:

size_t strcspn(const char *s, const char * reject);
从参数s 字符串的开头计算连续的字符,而这些字符都完全不在参数reject 所指的字符串中。简单地说, 若strcspn()返回的数值为n,则代表字符串s 开头连续有n 个字符都不含字符串reject 内的字符。

size_t strspn (const char *s,const char * accept);
从参数s 字符串的开头计算连续的字符,而这些字符都完全是accept 所指字符串中的字符。简单的说,若strspn()返回的数值为n,则代表字符串s 开头连续有n 个字符都是属于字符串accept内的字符。

在这段代码中,strcspn() 统计第一次出现的空白字符前的字符数量 ,strspn() 统计第一次出现的非空白字符前的字符数量,很显然这样做的目的是跳过字符串中的空白字符。
每次使用 next_tok 后我们就可以得到字符串中对应位置的一段的有用信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值