我正在尝试从c中的字符串中提取子字符串。我试图复制this回答,但我无法正确使用正则表达式。
来自字符串
"-u username@web.com -p password -P passphrase -t tun_dev0 www.google.ie"
我想提取tun_dev0
。此外,该字符串中的参数可以是任何顺序,-t
之后可能有可变数量的空格。
#include <stdio.h>
int main() {
char *parameters = "-u username@web.com -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 username@web.com -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;
}
答案 0 :(得分:1)
您可以使用strtok:
#include <stdio.h>
#include <string.h>
int main() {
char parameters[] = "-u username@web.com -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 username@web.com -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;
}
答案 1 :(得分: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++;
}