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

时间:2015-04-11 01:48:26

标签: c arrays string pointers char

该任务首先返回stopstring内任意字符的第一个实例的索引:

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

    int i = 0;
    int j = 0;

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

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

find_any_index("abcdefg", "zyd")找到索引3。

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

  • 无法使用整数
  • 无法使用数组索引
  • 无法使用<string.h>
  • 中的任何功能
  • 返回指针而不是索引

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

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

4 个答案:

答案 0 :(得分:3)

在这种情况下,您将使用字符指针。在这里,您将针对string中的每个字符检查stop中的每个字符。当stop中的任何字符匹配时,返回指向string中位置的指针。如果未找到匹配项(返回stringNULL,示例将返回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;
}

答案 1 :(得分:0)

这是你的功能应该是什么样子的骨架:

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

    for ( ; *cp1 != '\0'; ++cp1 )
    {
       for ( cp2 = stop; *cp2 != '\0'; ++cp2 )
       {
       }
    }
    return NULL;
}

我认为你可以完成其余的工作。

答案 2 :(得分:0)

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

首先在stop上迭代,我们可以构建一个查找表。表格中的每一位都对应于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,我消除了两个强制转换,这提高了此代码的易读性。我认为这更重要。

答案 3 :(得分:-2)

你可以从这样的事实开始:在C中,a [1]相当于*(a + 1)。 限制&#34;不能使用整数&#34;可能表明你应该使用&#34; char&#34;代替。它的作用类似于整数,但仅限于8位范围(0-255)。