расстояние между двумя указателями в C - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть функция, которая должна читать строку (только с цифрами в ней) и возвращать наибольшую последовательность, которая имеет повторяющиеся числа.например: 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 ]

3 голосов
/ 13 апреля 2011

Я думаю, что ваша проблема с strchr() и что он возвращает, когда не находит искомого персонажа.В этом случае он возвращает 0, а не начало или конец строки, которая ему передана.

Вам также следует рассмотреть вопрос о том, чтобы сделать ввод «const char *», и посмотреть, зачем вам это нужно.вызывать strlen() на каждой итерации двух циклов.Вы, вероятно, можете сделать это лучше.

Обратите внимание, что если самая длинная подстрока неповторяющихся цифр - все 10 цифр, выделенное пространство слишком мало - вам нужно выделить байт для NUL '\0'конец строки тоже.Кроме того, strncpy() не гарантирует нулевое завершение вашей строки;Я не уверен, является ли это частью вашей проблемы здесь.

1 голос
/ 13 апреля 2011
if(strlen(strncpy(aux, (v+i),j))

и

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

Если j равно > 10, то вы перезаписываете память, которой не владеете, что может привести к всевозможным смешным проблемам.

0 голосов
/ 13 апреля 2011

Я собираюсь предложить алгоритм 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;
    }
}
...