C在带有指针的字符串中查找子字符串

时间:2015-04-12 23:36:42

标签: c arrays string

我正在尝试在没有整数或数组索引的字符串中返回子字符串的指针。这是我的代码。我不知道如何让它发挥作用。

/*
 * Return a pointer to the first character of the first occurrence of
 * <substr> in the given <string> or NULL if <substr> is not a substring
 * of <string>.
 * Note: An empty <substr> ("") matches *any* <string> at the <string>'s
 * start.
 *****
 * YOU MAY *NOT* USE INTEGERS OR ARRAY INDEXING.
 *****
 */
char *find_substr(char *string, char* substr) {

    char* first_occ = NULL;

    while(*string) {
        if(*string++ == *substr) {
            if(first_occ == NULL){
                first_occ = string;
            }
            char const *a = substr;
            while((*string++ == *++a) && (*a));  /*empty*/
            if(*a == '\0')
                return first_occ;
        }
    }
    return first_occ;
}

1 个答案:

答案 0 :(得分:0)

首先,如果substr为空字符串,则代码不起作用。为此添加一个简单的测试。

第二:为什么你只保存初始角色的第一场比赛?这会导致为find_substr("aab", "ab")返回错误的指针。

 if(first_occ == NULL){
     first_occ = string;
 }

您应该删除测试。

然后你检查其他字符,但是如果匹配失败,你没有保存string的值来重置它:

       char const *a = substr;
        while((*string++ == *++a) && (*a));  /*empty*/
        if(*a == '\0')
            return first_occ;

以下是更正后的版本:

char *find_substr(char *string, char *substr) {
    for (;;) {
        if (*string == *substr) {
            for (char *p1 = string, *p2 = substring;;) {
                if (!*p2)
                    return string;
                if (*p1++ != *p2++)
                    break;
            }
        }
        if (!*string++)
            break;
    }
    return NULL;
}