Я работаю через K & R (второе издание) для собственного назидания и столкнулся следующее упражнение (упражнение 2-2 p42):Kernighan и Ritchie Упражнение 2-2 Отладка?
Write a loop equivalent to the following without using && or ||:
for (i=0; i<lim-1 && (c=getchar()) != '\n' && c != EOF; ++i)
s[i] = c;
Это было мое решение:
#include <stdio.h>
/* write a loop equivalent to the following without using && or ||
for (i=0; i<lim-1 && (c=getchar()) != '\n' && c != EOF; ++i)
s[i] = c;
*/
int main()
{
int counter = 0, lim = 1000;
int s[lim], c;
while(counter < lim-1)
{
while((c = getchar()) != '\n')
{
while(c != EOF)
{
s[counter] = c;
}
}
counter++;
}
return 0;
}
I ожидал отступы и, следовательно, вся программа выходила нормально, как только она столкнулась с символом новой строки ('\n'
) или символом EOF (Ctrl-d
на моей машине Linux), но, к моему удивлению, он счастливо водит солдат. Я попытался отладить его, используя gdb, но все еще не мог понять.
Что я не вижу?
Приложение: Я попытался изменить последовательность тестов, пока выполняются циклы while, и добавил оператор if, чтобы выйти из внешнего цикла, если c == '\n'
, но я все еще не вижу его! Я также испытываю трудности с попыткой запустить GDB, вводя текст в командную строку, и одновременно распечатать значение c
, даже когда я попытался связать gdb с pid исполняемой копии исполняемого файла. Я понимаю, что есть, вероятно, другие способы решения этого упражнения, например. устанавливая флаг или переменную OK_TO_EXECUTE
, которая истинна только в том случае, если выполняются все три условия, но меня беспокоит тот факт, что я, похоже, не могу найти ошибку в кажущейся простой программе. Именно поэтому я возвращаюсь к K & R, чтобы более тщательно изучить книгу и правильно решить упражнения.
Redone код (все еще глючит !!!):
#include <stdio.h>
/* write a loop equivalent to the following without using && or ||
for (i=0; i<lim-1 && (c=getchar()) != '\n' && c != EOF; ++i)
s[i] = c;
*/
int main()
{
int counter = 0, lim = 1000;
int s[lim], c;
while((c = getchar()) != EOF)
{
if (c == '\n')
break;
while(c != '\n')
{
while(counter < lim-1)
{
s[counter] = c;
counter++;
}
}
}
return 0;
}
РЕШИТЬ! - Я думаю! Кажется, я наконец понял это. Внутренние петли, как написано в моем повторном решении, будут продолжаться бесконечно или в лизинге до достижения lim
. Я добавил перерыв заявления и думаю, что я нахожусь на пути к решению.
Я все еще борюсь с тем, как запустить gdb по этой проблеме; введите записи в командной строке И print
значение c
. Связывание gdb с pid исполняемого файла по-прежнему не работает должным образом. Я даже разместил separate question относительно gdb.
Перейдите на страницу http://lysator.liu.se/c и ознакомьтесь с учебниками C, перечисленными там. Они довольно устарели (почти столько же, сколько и K & R2), но все же очень актуальны. – vonbrand
@vonbrand Спасибо, что указали этот ресурс. – haziz