Пишу машзальное задание на Си, все вроде просто и понятно.
Надо реализовать программу, которая берет на вход строки, сортирует их, выводит. Потом спрашивает, не хочет ли пользователь еще один набор строк отсортировать.
Получается что-то вроде (можно пропустить, интересное ниже ):
int main() { list *p, *temp; char* q; char c; p = malloc(sizeof(list)); // создали заглавное звено списка p->next = NULL; temp = malloc(sizeof(list)); while (input(temp)!=EOF) { // вводим find_place(p, temp); // находим место для элемента temp = malloc(sizeof(list)); } free(temp); output(p); // выводим free_all(p); // чистим память // вот здесь спрашиваем пользователя и ждем ответа в виде <y=Да> или <что-либо еще=Нет> // clearerr(stdin) надо поставить сюда printf("Do you want to sort a new list (y/N)?\n"); q = malloc(3*sizeof(char)); fgets(q, 3, stdin); if ((q[0]=='y' || q[0]=='Y') && (q[1]=='\n' || q[1]=='\r')) main(); free(q); return 0; }
Так вот, на мой взгляд, код простой и вообще. Под убунтой работает прекрасно.
Идем во FreeBsd (в МЗ именно они). Все работает правильно, запрос на повторный запуск не работает.
Смотрим, что пишет поток: там появляются код символов "-80", "-64", "-128", "4" и т. д. Что это значит, пока не понял.
Проблема решается с помощью clearerr(stdin):
The function clearerr() clears the end-of-file and error indicators for the stream pointed to by stream.
Вопрос: чем успевает засориться stdin и является ли clearerr() достаточно кроссплатформенной, чтобы ее использовать везде? Почему под убунтой clearerr() не нужен, а во фри нужен, где разница между системами?