我需要解析很多文件名(最多250000我猜),包括路徑,並從中提取一些部分。「模式匹配」和提取在C
下面是一個例子:
原文:/my/complete/path/to/80/01/a9/1d.pdf
需要:8001a91d
的 「模式」 我正在尋找將始終以 「/ 8」 開頭。我需要提取的部分組成一個8位十六進制數字的字符串。
我的想法是以下(simplyfied演示):
/* original argument */
char *path = "/my/complete/path/to/80/01/a9/1d.pdf";
/* pointer to substring */
char *begin = NULL;
/* final char array to be build */
char *hex = (char*)malloc(9);
/* find "pattern" */
begin = strstr(path, "/8");
if(begin == NULL)
return 1;
/* jump to first needed character */
begin++;
/* copy the needed characters to target char array */
strncpy(hex, begin, 2);
strncpy(hex+2, begin+3, 2);
strncpy(hex+4, begin+6, 2);
strncpy(hex+6, begin+9, 2);
strncpy(hex+8, "\0", 1);
/* print final char array */
printf("%s\n", hex);
這工作。我只是覺得它不是最聰明的方式。而且可能有些陷阱我看不到自己。
那麼,有人有建議這種指針移位方式會有什麼危險嗎?你認爲什麼會有所改進?
C是否提供了這樣的功能,如s|/(8.)/(..)/(..)/(..)\.|\1\2\3\4|
?如果我沒有記錯,一些腳本語言有這樣的功能;如果你明白我的意思。
我認爲你這樣做大部分是正確的,但會用普通的賦值來替換'strncpy',並將這個操作限制在一個我不需要看到的函數中。 – cnicutar 2013-03-03 09:38:36
你的意思是這樣的'hex [0] = begin [0];'? – 2013-03-03 09:41:32
是的。但這更多的是品味的問題,對我來說看起來很好的東西可能會讓你看起來很可怕。 – cnicutar 2013-03-03 09:43:40