#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. СПАСИБО ТЕБЕ, аксиак, за твой ответ.