在具有通配符的 char[] 中查找子字符串
Finding substring in a char[] with wildcard character
我有一个字符数组,一旦用户输入一串字符,我的程序就需要在我的大字符数组中找到这串字符并报告其索引。但是,如果有一个通配符,例如 !
,这将代表我的数组中的任何字符,我如何让我的程序将 !
读取为任何字母?
示例:
char letter [] = {a,b,c,d,e,d,s,f,e}
如果用户输入ab!
,程序可以将其解释为abc,并将return找到abc
的索引值。
您可以实现自己的 strstr
版本,它添加了一个简单的额外条件。让我们调用函数 StrStr
.
char* StrStr(const char *str, const char *target) {
if (!*target) return NULL;
char *p1 = (char*)str;
while (*p1) {
char *p1Begin = p1, *p2 = (char*)target;
while (*p1 && *p2 && (*p1 == *p2 || *p2 == '!')) {
p1++;
p2++;
}
if (!*p2)
return p1Begin;
p1 = p1Begin + 1;
}
return NULL;
}
这将简单地测试是否在 str
中找到 target
并将比较每个字符。如果字符是感叹号,如果它们不同,它将忽略。
你可以这样调用,然后用result - letter
获取位置。
result = StrStr(letter, "b!d");
if(result != NULL) {
int position = result - letter;
printf("%d\n", position);
}else {
printf("-1\n");
}
如果你想检查多次出现,你可以创建一个指向字母的指针,然后将其设置为等于 letter
的地址加上位置加一,以检查稍后是否在数组中找到子字符串.
pointer = letter;
while((result = StrStr(pointer, "a!c")) != NULL) {
int position = result - letter;
pointer = letter + position+1;
printf("%d\n", position);
}
这是一个 live 示例。
我有一个字符数组,一旦用户输入一串字符,我的程序就需要在我的大字符数组中找到这串字符并报告其索引。但是,如果有一个通配符,例如 !
,这将代表我的数组中的任何字符,我如何让我的程序将 !
读取为任何字母?
示例:
char letter [] = {a,b,c,d,e,d,s,f,e}
如果用户输入ab!
,程序可以将其解释为abc,并将return找到abc
的索引值。
您可以实现自己的 strstr
版本,它添加了一个简单的额外条件。让我们调用函数 StrStr
.
char* StrStr(const char *str, const char *target) {
if (!*target) return NULL;
char *p1 = (char*)str;
while (*p1) {
char *p1Begin = p1, *p2 = (char*)target;
while (*p1 && *p2 && (*p1 == *p2 || *p2 == '!')) {
p1++;
p2++;
}
if (!*p2)
return p1Begin;
p1 = p1Begin + 1;
}
return NULL;
}
这将简单地测试是否在 str
中找到 target
并将比较每个字符。如果字符是感叹号,如果它们不同,它将忽略。
你可以这样调用,然后用result - letter
获取位置。
result = StrStr(letter, "b!d");
if(result != NULL) {
int position = result - letter;
printf("%d\n", position);
}else {
printf("-1\n");
}
如果你想检查多次出现,你可以创建一个指向字母的指针,然后将其设置为等于 letter
的地址加上位置加一,以检查稍后是否在数组中找到子字符串.
pointer = letter;
while((result = StrStr(pointer, "a!c")) != NULL) {
int position = result - letter;
pointer = letter + position+1;
printf("%d\n", position);
}
这是一个 live 示例。