Кажется, теперь я понимаю программу, за исключением того, что функция getline
не очень интуитивно понятна, поскольку кажется, что она копирует все, что getchar()
возвращает, в массив символов s[]
, который никогда не используется для чего-то важного.
int getline(char s[], int lim)
{
int c, i;
for(i=0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
s[i] = c;
if(c == '\n')
{
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
С таким же успехом функция может игнорировать строку s[i] = c;
, потому что все, что на самом деле делает функция, — это подсчет количества символов, пока не достигнет EOF
или '\n'
не вернется из getchar()
.
Чего я действительно не понимаю, так это почему программа продвигалась вперед, поскольку основной цикл выглядит следующим образом:
main()
{
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max)
{
max = len;
copy(longest, line);
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}
Единственным объяснением может быть то, что функция getchar()
делает свое волшебство после того, как пользователь ввел полную строку текста и нажал клавишу enter. Так что, похоже, это работает во время выполнения, я думаю.
Так программа продвигается? Входит ли программа сначала в цикл while, а затем ждет, пока пользователь введет строку текста, и как только пользователь нажимает клавишу ввода, цикл for функции getline
повторяется? Я чувствую, что это так, поскольку пользователь может ввести backspace во время ввода.
Мой вопрос в том, как именно программа вообще продвигается вперед? Это все из-за функции getchar()
?
Когда я нажимаю ctrl-D в терминале, происходят некоторые другие запутанные вещи. Если я нажму ctrl-D в начале новой строки, программа завершится. Если я нажму ctrl-D в конце строки, заполненной каким-либо текстом, она не завершится и не будет действовать так же, как нажатие enter< /кбд>. Если я несколько раз нажму ctrl-D в строке с текстом, программа, наконец, завершится.
Это просто то, как мой терминал обрабатывает сеанс, или это все, о чем мне не следует беспокоиться, если я просто хочу выучить C?
Причина, по которой я спрашиваю, заключается в том, что мне нравится отслеживать программу, чтобы получить хорошее представление о ней, но функция getchar()
усложняет эту задачу.