Ошибка с getchar()
code.c:
#include<stdio.h>
#include<stdlib.h>
#include <ctype.h>
#include<string.h>
#define MAX_WORD_LENGHT 128
typedef struct Node {
char *word; // Слово
int cnt; // Кол-во данных слов
struct Node *next; // Указатель на следующий элемент стека
} Node;
int increase ( Node *head, char *word )
{
Node *x = head;
do {
if ( strcmp((x->word), word) == 0 )
{
x->cnt++;
return 1;
}
x = x->next;
} while ( x->next != NULL );
return 0;
}
void push ( Node **head, char *word_link )
{
Node *tmp;
if ( ( tmp = (Node*) malloc(sizeof(Node)) ) == NULL )
{
printf("Malloc function error.\n");
exit(1);
}
tmp->word = word_link;
tmp->cnt = 1;
tmp->next = *head;
*head = tmp;
}
int reader ( char word[MAX_WORD_LENGHT], int *letter_count )
{
char c;
*letter_count = 0;
while ( (c = getchar()) != ( EOF || ' ' || '\t' || '\n' ) )
{
printf("%d\n", *letter_count); // Для отладки
if ( *letter_count >= MAX_WORD_LENGHT )
{
printf("Word lenght exceeded.\n");
return 0;
}
word[*letter_count] = c;
*letter_count += 1;
}
if ( c != EOF )
{
word[*letter_count] = '\0';
return 1;
}
return 0;
}
void malloc_it ( char *word_link, char word[MAX_WORD_LENGHT], int letter_count )
{
if ( (word_link = (char*) malloc(letter_count)) == NULL )
{
printf("Malloc function error.\n");
exit(1);
}
strcpy(word_link, word);
}
int main ( void )
{
Node *head = NULL;
char word[MAX_WORD_LENGHT];
char *word_link;
int letter_count;
while ( reader(word, &letter_count) != 0 )
{
if ( !(increase(head, word)) )
{
malloc_it(word_link, word, letter_count);
push(&head, word_link);
}
}
return 0;
}
Планировалось организовать считывание слов со стандартного ввода и помещение их в стек если они появились первый раз, если же они уже встречались до этого - увеличить счетчик. ( не доделано ).
user@user:~$ cc code.c
user@user:~$ ./a.out
a
0
1
bc
2
3
4
def
5
6
7
8
CTRL+D
9
10
11
12
...
127
128
Word lenght exceeded.
Почему это происходит? Не обнуляется переменная для подсчета длины слова после ввода пробельного символа как ожидалось, а после нажатия CTRL+D происходит увеличение этой переменной до максимального значения и выход из программы.
Ответы (1 шт):
Давайте посмотрим, как же работает
(c = getchar()) != ( EOF || ' ' || '\t' || '\n' )
Вы считываете значение типа int, преобразуете его в char и записываете в c, каковое затем сравнивается с результатом применения операции логического (не побитового) или к значениям EOF и так далее, которые все ненулевые, а значит, рассматриваются как true, т.е. в результате вы сравниваете c с единицей.
Все остальное я и не рассматривал...
Так что вам надо переписать ваше сравнение правильно — как или для сравнений c с конкретным символом. Только учтите, что если c — char, то сравнение с EOF может сработать неверно — например, при чтении символа с кодом -1 (0xFF, в зависимости от знаковости/беззнаковости char в вашей реализации).
EOF для того и есть значение int (обычно -1, не помню, кажется, в стандарте не говорится, что именно -1, но дело не в этом — главное, что EOF не может совпадать ни с одним считанным значением char). Потому getchar и возвращает int, а не char, так что советую подумать над изменением типа c.