2013-11-27 162 views
0

我想從c中的字符串中提取一個子字符串。我試圖複製this的答案,但我無法得到正確的正則表達式。正則表達式從字符串中提取特定的子字符串

從字符串

"-u [email protected] -p password -P passphrase -t tun_dev0 www.google.ie"

我想提取tun_dev0。此外,該字符串中的參數可以以任意順序排列,並且在-t之後可能有可變數量的空格。

#include <stdio.h> 
int main() { 
    char *parameters = "-u [email protected] -p password -P passphrase -t tun_dev0 www.google.ie"; 

    char tun[64]; 

    sscanf(parameters, "-t %63[^ *]", tun); 

    fprintf(stderr, "\n%s\n\n",tun); 

    return 0; 
} 

注:字符串不提供這個節目

編輯

按perreal的答案參數,這裏是我的實現,它似乎工作,但它似乎跳過第一個參數。

/*Get the parameter value associated with the specified parameter i.e -t/-p */ 
char *get_parameter(char *parameters, char parameter) 
{ 
    char *p = strtok(parameters, "-"); 
    while(p) { 
     p = strtok(NULL, "-"); 
     if (NULL != p) { 
      if (p[0] == parameter) { 
       p = strtok(p, " "); 
       p = strtok(NULL, " "); 
       printf("%s\n", p); 
       return p; 
       break; 
      } 
     } else { 
      return NULL; 
     } 
    } 
    return NULL; 
} 

int main() { 
    char parameters[100] = "-u [email protected] -p password -P passphrase -t tun_dev0 www.google.ie"; 
    char *parameter_value; 

    parameter_value = get_parameter(parameters,'u'); 

    if (parameter_value != NULL) { 
     fprintf(stderr,"%s\n",parameter_value); 
    } else { 
     fprintf(stderr,"No matching param found!\n"); 
    } 
    return 0; 
} 
+1

有關於'的char *參數的細微問題=「-u我們......」。建議OP真正需要'char參數[] =「-u us ...」'。 – chux

+0

是的,我認爲你是對的,謝謝 – TomSelleck

回答

1

你可以使用strtok的:

#include <stdio.h> 
#include <string.h> 
int main() { 
    char parameters[] = "-u [email protected] -p password -P passphrase -t tun_dev0 www.google.ie"; 
    char *t = strtok(parameters, "-"); 
    while(t) { 
     t = strtok(NULL, "-"); 
     if (t[0] == 't') { 
      t = strtok(t, " "); 
      t = strtok(NULL, " "); 
      printf("%s\n", t); 
      break; 
     } 
    } 
    return 0; 
} 

你與你strtok無法解析嵌套的選項。但是你可以先拿到-參數,並對其進行處理:

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

int main() { 
    char parameters[] = "-u [email protected] -p password -P passphrase -t tun_dev0 www.google.ie"; 
    char *t; 
    char *args[256] = {0}, **arg = args; 
    for (t = strtok(parameters, "-"); t != NULL; t = strtok(NULL, "-"), arg++) { 
     *arg = t; 
    } 
    for (arg = args; *arg; arg++) { 
     for (t = strtok(*arg, " "); t != NULL; t = strtok(NULL, " ")) { 
      printf("%s\n", t); 
     } 
    } 
    return 0; 
} 
+0

完美,謝謝! – TomSelleck

+0

實際上這有一個問題,它似乎跳過第一個參數,任何想法如何解決這個問題? – TomSelleck

+0

@Tomcelic,你的意思是'-u'? – perreal

0

strtok()是更好的辦法,但如果你仍然sscanf()

char tun[64]; 
const char *p = parameters; 
while (*p) { 
    if (1 == sscanf(p, "-t %63s", tun)) { 
    fprintf(stderr, "\n%s\n\n",tun); 
    break; 
    } 
    p++; 
} 
相關問題