如何更改我的 C 代码以使用指针?

How do I alter my C code to use pointers?

任务最初是 return stringstop 中任何字符的第一个实例的索引:

int find_any_index(char string[], char stop[]) {

    int i = 0;
    int j = 0;

    while(string[i++] != '[=10=]'){
        while(stop[j++] != '[=10=]'){

            if(string[i-1] == stop[j-1]){
                return i-1;
            }
        }
        j = 0;
    }
    return NOT_FOUND ;
}

find_any_index("abcdefg", "zyd") 例如,查找索引 3。

但是,我现在需要按照以下规定完成同样的任务:

char *find_any_ptr(char *string, char* stop) {
    return NULL ;   // placeholder
}

我几乎不懂指针,也不明白如何使用它们来访问单个字符而不是在数组中递增。

你可以从 C 语言中的 a[1] 等价于 *(a+1) 开始。 限制 "Cannot use integers" 可能表明您应该改用类型 "char"。它的作用类似于整数,但仅限于 8 位范围 (0-255)。

下面是您的函数的框架:

char* find_any_index(char string[], char stop[])
{
    char* cp1 = string;
    char* cp2 = NULL;

    for ( ; *cp1 != '[=10=]'; ++cp1 )
    {
       for ( cp2 = stop; *cp2 != '[=10=]'; ++cp2 )
       {
       }
    }
    return NULL;
}

我想你可以完成剩下的。

在这种情况下,您将使用字符指针。在这里,您将对照 stop 中的每个字符检查 string 中的每个字符。当匹配 stop 中的任何字符时,return 指向 string 中位置的指针。如果未找到匹配项(return stringNULL,示例 returns NULL)示例:

char *find_any_index(char string[], char stop[]) {

    char *p = string;
    char *sp = NULL;

    while (*p)
    {
        sp = stop;
        while (*sp)
        {
            if (*sp == *p)
                return p;
            sp++;
        }
        p++;
    }

    return NULL;
}

不幸的是,不管怎样,这个任务中总会有整数。 charunsigned char 是整数类型。我假设任务是生成高效的代码,没有不必要的变量(整数或其他)。

通过首先迭代 stop,我们可以构建一个查找 table。 table 中的每一位将对应于该位位置的字符是否存在于 stop.

unsigned char table[CHAR_MAX / CHAR_BIT + 1] = { 0 };
while (*stop) {
    unsigned char c = *stop++;
    table[c / CHAR_BIT] |= 1 << c % CHAR_BIT;
}

这将内部循环减少为单比特测试,将常数时间复杂度从O(mn)减少到O(m+n)

while (*string) {
    unsigned char c = *string;
    if (table[c / CHAR_BIT] & (1 << c % CHAR_BIT)) {
        return string;
    }
    string++;
}

从技术上讲,c 是一个不必要的变量(也是一个整数),但是通过在每段代码中使用 c,我消除了两个转换,从而提高了这段代码的易读性。我认为这更重要。