2015-09-14 1 views
3

У меня есть кусок кода C, который полностью удаляет каждый второй символ из массива символов, делая исходный массив пополам (половина + 1, если размер был нечетным)C удаление строк - как работает этот код?

.. но я не могу понять, как оно работает.

void del_str(char string[]) { 
    int i,j; 
    for(i=0, j=0; string[i]!=0; i++) { 
     if(i%2==0) { 
      string[j++]=string[i]; 
     } 
    } 
    string[j]=0; 
} 

// 
example input: 'abcdefgh' 
output from that: 'aceg' 
what I thought the output would be: 'aacceegg' 

Линия Я не понимаю

string[j++]=string[i]; 

Я могу написать код, который опускает каждый второй символ, поэтому результат будет:

'a c e g ' 

, но я не могу оберните мою голову вокруг этого.

Как вы можете написать программу, которая полностью удаляет каждый n-й символ и их пространство в исходном массиве? (производя тот же вывод, что и указанный код)

+3

Выберите язык, братан. –

+0

Вы говорите, что входной сигнал ** «abcdefgh» **, а выход - ** «acfg» **, поэтому мой вопрос - не должен быть ожидаемым выходом ** aceg **? Для моей стороны это ваш ** «каждый второй символ из массива символов» **. – Michi

+0

Вы совершенно правы, я отредактировал часть – user2859280

ответ

4

В этом коде используются два индекса положения, i и j. Изначально оба индекса инициализируются до нуля. Индекс i используется для чтения; индекс j используется для записи.

Индекс i увеличивается на каждом шаге цикла, поскольку приращение i++ находится в заголовке цикла. Индекс j, с другой стороны, увеличивается на каждую итерацию, потому что j++ происходит только тогда, когда i. Индекс i всегда находится как можно ближе или ближе к концу строки, чем индекс j, потому что он перемещается «быстрее».

Нулевой ограничитель находится в конечной позиции j в конце цикла, чтобы указать новое положение конца строки.

Возможно, было бы легче увидеть небольшой пример. Рассмотрим начальную строку "abcdef". Ее представление в памяти в начале работы алгоритма выглядит следующим образом:

'a' 'b' 'c' 'd' 'e' 'f' '\0' 

Вот как это будет меняться после каждого шага цикла:

'a' 'b' 'c' 'd' 'e' 'f' '\0' 
'a' 'c' 'c' 'd' 'e' 'f' '\0' 
'a' 'c' 'e' 'd' 'e' 'f' '\0' 
'a' 'c' 'e' '\0' 'e' 'f' '\0' 

Поскольку строки C игнорировать все после '\0', то «хвост» 'e' 'f' '\0' не считается частью строки.

+0

Спасибо большое! Часть, которую мне не хватало, была '\ 0', которая дублировалась и заканчивала строку на половину размера. – user2859280

1

i и j не являются самыми ясными именами переменных. Возможно, renamig j что-то вроде output поможет.

Замечание, когда j обновляется, только если вы находитесь в нечетном положении. Итак, i идет по всему списку, в то время как j поднимает прочитанное что-то копировать с i назад на j-е место, переписывая то, что было там раньше. Последняя строка, string[j]=0, завершает вашу строку.

1

Вы забыли о if(i%2==0), что имеет решающее значение. Эта строка в основном пропускает каждый второй символ.Затем линия вы определили можно разделить на 2 части:

string[j]=string[i]; // Overwrite the character at position j 
j++;     // Now increase j 

Переменная i отслеживает позиции строки, которую вы достигли при чтении; j используется для письма. В конце вы пишете 0 в позиции j, чтобы завершить строку.

Смежные вопросы