C中两个指针之间的距离

时间:2011-04-12 20:02:48

标签: c pointers distance

我有一个函数,它应该读取一个字符串(只有数字),并返回最重要的序列,重复数字。 例如: 12345267890

它应该返回:345267890

我手动试验了代码,我相信它应该可行。但是当我运行它时,当它到达这条线i=(strchr(v+i, *(v+j)))-v;而不是获得指针之间的距离时,我会得到像-1046583这样的东西。我可以这样做吗?

char* bigSeq(char *v){

    int i, j;
    char *aux, *bgst;
    aux=(char*) malloc(10*sizeof(char));
    bgst=(char*) malloc(10*sizeof(char));
    for(i=0;i<strlen(v);i++){
        for(j=0;j<strlen(v+i);j++){
            if(strchr(v+i, *(v+j)) != (v+j)){
                if(strlen(strncpy(aux, (v+i),j)) > strlen(bgst))
                    strncpy(bgst, (v+i),j);
                i=(strchr(v+i, *(v+j)))-v;
                break;
            }
        }
    }
    return bgst;
}

3 个答案:

答案 0 :(得分:3)

我认为你的麻烦在于strchr()以及当它找不到你要搜索的角色时它会返回什么。在这种情况下,它返回0,而不是传递给它的字符串的开头或结尾。

您还应该检查输入是否为“const char *”,并查看为什么需要在两个循环的每次迭代中调用strlen()。你可以做得更好。

请注意,如果非重复数字的最长子字符串全部为10位,则分配的空间太小 - 您需要在字符串末尾为NUL '\0'分配一个字节。此外,strncpy()不保证空字符串终止;我不确定这是否是你问题的一部分。

答案 1 :(得分:1)

if(strlen(strncpy(aux, (v+i),j))

strncpy(bgst, (v+i),j);

如果j> 10你覆盖了你不拥有的记忆 - 这会导致各种有趣的问题。

答案 2 :(得分:0)

我将建议一个O(N)算法,它也更简单,更容易阅读,并且除了堆栈上的几个指针和整数之外不需要额外的内存。这些功能有助于消除错误的可能性。

void longest_non_repeating( const char** output_begin, const char** output_end, const char* input )
{
    const char* last_occurrence[10] = { input-1 };
    const char* candidate_begin = input;
    while( *input )
    {
        if( last_occurrence[*input-'0'] < candidate_begin )
        {
            const char* candidate_end = input+1;
            if( candidate_end - candidate_begin > *output_end - *output_begin )
            {
                *output_begin = candidate_begin;
                *output_end = candidate_end;
                if( ( candidate_end - candidate_begin ) == 10 )
                    return;
            }
        }
        else
        {
          input = candidate_begin = last_occurrence[*input-'0'] + 1;
          std::fill( last_occurrence, last_occurrence+10, input-1 );
        }
        last_occurrence[*input-'0'] = input;
        ++input;
    }
}