2015-10-21 51 views
0

我有一个字符数组,并且一旦用户输入字符串,我的程序需要在我的大字符数组中找到字符串并报告其索引。但是,如果有一个通配符字母(如!),它将代表我阵列中的任何字符,那么我将如何让我的程序以任何字母的形式读取!用通配符在字符[]中查找子字符串

实施例:

char letter [] = {a,b,c,d,e,d,s,f,e} 

如果用户输入ab!,该程序可以把它解释为abc和将返回其中abc被发现的它的索引值。

+1

寻找下一个感叹号,当发现添加一个迭代器,... – Downvoter

+0

如果用户输入'bca'会输出什么? – coderredoc

+0

你可以发布任何代码,你的输入匹配数组* *没有通配符吗?随后尝试使用通配符时?如果你已经迈出了第一步,那么你肯定会正确地发布大数组'letter'? –

回答

0

你可以实现你自己的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; 
} 

如果targetstr发现将比较每个字符这将简单地测试。如果该字符是感叹号,则它会忽略它们是否不同。

你可以这样称呼它,然后使用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的例子。

+0

if(!* target)return str' if'(!* target)return p1'(在反转这两条语句之后)应该避免编译器警告吗?甚至是'返回NULL'?或者,函数是否会更好地返回索引或-1,以便在不修改返回的指针的情况下满足该问题? –

+0

@WeatherVane也许,否则会给出错误的输出。 – Linus

+0

结果 - 字母给出了位置,但是如果在数组中稍后发现目标,我将如何循环这个?我尝试使用一段时间(结果!= NULL),但它仍然只提供一个位置 – Rain74