Почему я получаю пробел в своей программе вместо третьего последнего символа?

#c

Вопрос:

Почему я получаю пробел в своей программе вместо третьего последнего символа? Даже если я изменю переменную string str, я получу тот же результат.

 #include lt;stdio.hgt; #include lt;string.hgt; void parser(char array[]) {  int a, b;  for (int i = 0; i lt; strlen(array); i  ) {  if (array[i] == 'gt;') {  a = i;  break;  }  }  for (int j = a; j lt; strlen(array); j  ) {  if (array[j] == 'lt;') {  b = j;  }  }  for (int p = 0, q = a   1; p lt; b - a - 1, q lt; b; p  , q  ) {  array[p] = array[q];  array[b - a] = '';  printf("%c", array[p]);  } }  int main() {  char str[] = "lt;h1gt;hello there i am programmer.lt;/h1gt;";  parser(str);  return 0; }  

Комментарии:

1. Добро пожаловать в SO. Что вы получаете и что вы ожидаете получить в качестве результата?

2.Какова цель этой линии? array[b-a]=''; a и b являются значениями индекса gt; и lt; . Разница в этих показателях кажется не очень полезной. Кроме того, почему это происходит в цикле, когда эти значения не меняются?

3. Это странное условие для вашего цикла: plt;b-a-1,qlt;b знаете ли вы, что делает оператор запятой? Чего вы ожидаете от этого выражения?

4. Я предлагаю вам запустить свою программу в отладчике и проверить, где происходит выполнение. Также следите за содержанием переменных.

5.Возможно, ваши намерения могли бы быть более ясными, если бы вы использовали string.h функции, которые включают в себя множество вещей, которые могут быть полезны; например strcspn , strrchr , strpbrk , strchr .

Ответ №1:

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

 array[b-a]='';  

Когда for начнется этот цикл…

 for(int p=0,q=a 1;plt;b-a-1,qlt;b;p  ,q  ){  array[p]=array[q];  array[b-a]='';  printf("%c",array[p]);  }  

… значения a и b являются 3 и 32 .

Оператор array[b-a]=''; помещает символ NUL-терминатора в положение 29 in array .

Цикл начинается с p=0 , q=4 ( a 1 ) и повторяется до p тех пор, пока не достигнет 28 и q не достигнет 31 ( qlt;b )*.

Когда p есть 25 , q есть 29 и array[29] неоднократно устанавливалось значение '' на предыдущих итерациях, поэтому '' копируется в позиции 25 и печатается на экране.

Вы должны установить терминатор NUL только один раз, после цикла. И правильная позиция для этого b-a-1 -нет b-a ; вы правильно выразили это в for условиях инициализации ( p=0 ) и выхода ( plt;b-a-1 ).

В целом, код вокруг последнего for цикла должен быть таким:

 for(int p=0, q=a 1;qlt;b;p  ,q  ){  array[p]=array[q];  printf("%c",array[p]);  }  array[b-a-1]='';  

*Условие plt;b-a-1 игнорируется из-за символа запятой. Вы, вероятно, хотите amp; между условиями, но они эквивалентны, одного из них достаточно.

Комментарии:

1. СПАСИБО ТЕБЕ, аксиак, за твой ответ.