命令参数处理
在很多时候我们都会写一下带有命令及其参数处理的程序。比如说在模拟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 后我们就可以得到字符串中对应位置的一段的有用信息。