我有一个字符数组,并且一旦用户输入字符串,我的程序需要在我的大字符数组中找到字符串并报告其索引。但是,如果有一个通配符字母(如!
),它将代表我阵列中的任何字符,那么我将如何让我的程序以任何字母的形式读取!
?用通配符在字符[]中查找子字符串
实施例:
char letter [] = {a,b,c,d,e,d,s,f,e}
如果用户输入ab!
,该程序可以把它解释为abc和将返回其中abc
被发现的它的索引值。
我有一个字符数组,并且一旦用户输入字符串,我的程序需要在我的大字符数组中找到字符串并报告其索引。但是,如果有一个通配符字母(如!
),它将代表我阵列中的任何字符,那么我将如何让我的程序以任何字母的形式读取!
?用通配符在字符[]中查找子字符串
实施例:
char letter [] = {a,b,c,d,e,d,s,f,e}
如果用户输入ab!
,该程序可以把它解释为abc和将返回其中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;
}
如果target
在str
发现将比较每个字符这将简单地测试。如果该字符是感叹号,则它会忽略它们是否不同。
你可以这样称呼它,然后使用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的例子。
寻找下一个感叹号,当发现添加一个迭代器,... – Downvoter
如果用户输入'bca'会输出什么? – coderredoc
你可以发布任何代码,你的输入匹配数组* *没有通配符吗?随后尝试使用通配符时?如果你已经迈出了第一步,那么你肯定会正确地发布大数组'letter'? –