Это мой самый первый пост о переполнении стека, поэтому я надеюсь, что никому не наступлю на пятки.
Конечно, любой вклад приветствуется и приветствуется, но те, кто больше всего подходит для ответа, действительно прочитали бы книгу Язык программирования C, 2-е изд.
Я только что закончил кодировать Упражнение 6-4, но, кажется, не могу что-то понять. Почему функция getword () не читает EOF, пока я не нажму Ctrl + D (я кодирую на C в виртуальной машине Arch Linux)?
Многие из моих предыдущих упражнений из книги требуют чтения из стандартного ввода. Один из способов сделать это - использовать что-то вроде
while ((c = getchar()) != EOF) {...}
. В таком случае мне никогда не нужно нажимать Ctrl + D. Я ввожу свой ввод, нажимаю Enter, буфер стандартного ввода очищается, и EOF обнаруживается автоматически. Функция getword () также опирается на getchar () в своей основе, так почему она вешает мою программу?
Функция getword () вызывается из main ():
while (getword(word, MAX_WORD) != EOF) {
if (isalpha(word[0])) {
root = addtree(root, word);
}
}
Сама функция getword ():
int getword(char *word, int lim) {
char *w = word;
int c;
while (isspace(c = getch())) {
}
if (c != EOF) {
*w++ = c;
}
// This point is reached
if (!isalpha(c)) {
// This point is never reached before Ctrl+D
*w = '\0';
return c;
}
for ( ; --lim > 0; w++) {
if (!isalnum(*w = getch())) {
ungetch(*w);
break;
}
}
*w = '\0';
return word[0];
}
Я помещаю комментарии, чтобы указать момент, когда я определил, что EOF не читается.
Функции getch () и ungetch () аналогичны функциям, используемым в калькуляторе польской нотации из главы 4 (и эта программа могла читать EOF автоматически - путем нажатия Enter):
#define BUF_SIZE 100
char buf[BUF_SIZE];
int bufp = 0;
int getch(void) {
return (bufp > 0) ? buf[--bufp] : getchar();
}
void ungetch(int c) {
if (bufp >= BUF_SIZE) {
printf("ungetch: too many characters\n");
}
else {
buf[bufp++] = c;
}
}
На данный момент это первая программа, которую я написал с начала этой книги, которая требует, чтобы я вручную вводил EOF через Ctrl + D. Я просто не могу понять почему.
Заранее благодарен за объяснения ...