2013-09-20 4 views
0

Во-первых, английский не является моим основным языком. Я новичок в C, и одна из моих задач делает алгоритм RLE в конкретном случае, который это рассчитывать лишь на условиях, подобных тем: 'aaabb' 'bbbrr' 'ggskkkk' и т.д ... На этот случай: 'aaaaaayyy', I» ве сделали этот код:RLE-алгоритм в c

void StringRLE(char *pointer) 
{ 
    char rle[strlen(pointer)]; 

    int i=0; 
    int rleCount =1; 
    char *s = pointer+1,ch; 
    while(*pointer!= '\0') 
    {      
     if(*pointer==*s) 
      rleCount++; 
     else 
     { 
      itoa(rleCount, rle, 10); 
      ch = *pointer[i];         
      strcat(rle, ch); 
      puts(rle);            
      rleCount = 1; 
     } 

     pointer++; 
     s++; 
     i++; 
    }                   
} 

Но когда я использую itoa конвертировать мой int в строку во второй раз, когда это делается подсчет «у» itoa переопределения РЛЭ строки. Почему и как я могу это решить?

+0

Первое: 'символ RLE [STRLEN (указатель)];' 'должен быть символ RLE [StrLen (указатель) + 1];' –

+1

Не стоит забывать, что в худшем случае, строка RLE может иметь в два раза больше длины строки источника. Поэтому 'char rle [strlen (pointer) * 2 + 1];' – Medinoc

+0

Кстати, этот код не компилируется для меня. Многие ошибки компиляции - 1. Когда вы объявляете rle, вы не можете использовать strlen. Он должен быть постоянным значением. 2. В 'ch = * pointer [i]' должно быть * (указатель + i) и 3. В 'strcat (rle, ch)' должно быть 'strcat (rle, & ch)'. Вы даже можете повторно использовать этот код. Какой компилятор вы используете. –

ответ

0

Приведенный ниже код работает для меня. Сделал несколько изменений, чтобы заставить его скомпилировать и запустить.

void StringRLE(char *pointer) 
{ 
    char *rle = new char[strlen(pointer)]; 

    int i=0; 
    int rleCount = 1; 
    char *s = pointer+1, ch[2] = {0,0}; 
    while(*pointer!= '\0') 
    {      
     if(*pointer==*s) 
      rleCount++; 
     else 
     { 
      itoa(rleCount, rle, 10); 
      ch[0] = *pointer; 
      strcat(rle, ch); 
      puts(rle);            
      rleCount = 1; 
     } 

     pointer++; 
     s++; 
     i++; 
    }                   
}