K&R C Упражнение 1-18 без проблем вывода / отладки
Я написал код ниже в Code::Blocks как ответ на упражнение 1-18 K & R:
Напишите программу для удаления конечных пробелов и вкладок из каждой строки ввода и удаления полностью пустых строк.
Я имел в виду это, чтобы удалить пробелы и вкладки (я еще не занялся пустой строкой). while
Цикл правильно сохраняет ввод в массив символов ip
однако остальная часть кода, похоже, не работает как EOF
вообще не запрещает вывод.
#include <stdio.h>
#define MAXLINE 1000
main(){
int c, z;
char ip[MAXLINE];
z = 0;
while ((c = getchar()) != EOF) {
ip[z] = c;
++z;
}
for (z = 0; ip[z] == ' ' || ip[z] == '\t'; ip[z] = ip[z + 1]);
printf("%s", ip);
}
Я пытался использовать эту проблему в качестве способа изучения отладчика, но после добавления точки останова в строке 14, открытия окна наблюдения и нажатия стрелки запуска ничего не происходит. На моей точке останова желтая стрелка не отображается, параметры шагов отображаются серым цветом, а имена переменных и их значения не отображаются в окне просмотра.
Совет по исправлению моего кода приветствуется, но я действительно хочу знать, что я делаю или не делаю, это мешает отладчику помочь мне.
1 ответ
Если вы не видите никакого вывода, то это, вероятно, потому, что ваша программа застряла в цикле for: for (z = 0; ip[z] ...
, что происходит, если строка ip
начинается с двух последовательных пробелов и / или табуляции.
Алгоритм удаления определенного символа таков:
Есть две переменные, которые индексируют позицию в строке, назначения и источника. Код будет внутри внешнего цикла. Исходный индекс будет повторяться во внутреннем цикле, пока не найдет символ, который не является одним из символов, которые необходимо удалить, или нулевой символ. Затем символ из исходного индекса назначается целевому индексу. Затем код проверяет, достиг ли исходный индекс нулевого символа, и прерывает внешний цикл, если он это сделал. Оба индекса увеличиваются, внешний цикл повторяется.
В псевдокоде:
remove = '\t'
string
source = 0
destin = 0
while
while string at source equals remove and not-equals null character
source++
string at destin = string at source
if string at source equals null character
break
source++
destin++