再问
关于第三个参数flags当为FNM_NOESCAPE,man page里:
FNM_NOESCAPE
If this flag is set, treat backslash as an ordinary character, instead of an escape character.
查到资料:
If FNM_NOESCAPE is not set in flags, a backslash character ( '\' ) in pattern followed by any other character shall match that second character in string. In particular, "\\" shall match a backslash in string. If FNM_NOESCAPE is set, a backslash character shall be treated as an ordinary character.
若pattern是'a\q'
string是'aq'
我理解是如果未设置FNM_NOESCAPE,则二者是匹配的,如果设置了就不匹配。结果是不论是否设置都匹配,那到底参数FNM_NOESCAPE是怎么使用?能不能举个例子
问题点数:10、回复次数:5Top
1 楼fierygnu(va_list)回复于 2006-03-07 23:07:04 得分 10
Shell里"\"字符是ESCAPE字符,用来解除Shell里的特殊字符的含义,如*.?"'等等,结果是"\"自身也成了特殊字符,所以如果需要正常的"\",需要写\\。这个选项就是设置"\"是否是转义字符的。如果设置了,则"\\"就是两个"\"了,在某些情况下可读性好。Top
2 楼password636(亮)回复于 2006-03-08 13:44:58 得分 0
那么下面的两个程序片断:
const char *pattern = "a\\n";
const char *string = "a\n";
int result = fnmatch(pattern,string,0);//result == 1
//没有设置FNM_NOESCAPE,是不是应该匹配?为什么是1?0换成FNM_NOESCAPE,result还是1。
const char *pattern = "a\\d";
const char *string = "a\d";
int result = fnmatch(pattern,string,0);//result == 0
//但是有warning: unknown escape sequence '\d',与是否是转义序列有什么关系?
//0换成FNM_NOESCAPE,result是1。
要是不出现warning,是不是必须使用转义序列,但是转义序列为什么result 都是1?
Top
3 楼fierygnu(va_list)回复于 2006-03-08 14:15:41 得分 0
不是fnmatch的问题,是C语言转义序列(不是shell转义序列)的问题。实际上传送到fnmatch的字符串不是原来的串了。a\\n变成了a\n,a\n则是a加一个换行,当然怎么也不会匹配了。
而a\\d和a\d被当作了a\d和ad(这就是warning的来源),所以结果是0和1。Top
4 楼password636(亮)回复于 2006-03-09 17:48:27 得分 0
那一般用FNM_NOESCAPE参数的时候应该如何使用fnmatch,还有就是如何应对转义序列,就是C语言转义序列和shell转义序列和FNM_NOESCAPE的使用Top
5 楼fierygnu(va_list)回复于 2006-03-09 17:52:42 得分 0
?C转义序列是肯定要考虑的,FNM_NOESCAPE只控制是否考虑shell转义序列。Top




