void main(){ uchar inpbuf[BUFSIZ]; int n; uchar *reply, **ptr;
setlocale(LC_ALL, ""); for(ptr = words; *ptr; ptr++) printf("#\t%s\n", *ptr);
do{ printf("> "); fflush(stdout); if(gets((char *)inpbuf) == NULL) break;
switch(spellmatch(inpbuf, words, &reply)){ case -1: printf("Нет такого слова\n"); break; case 0: printf("Слово '%s'\n", reply); break; default: printf("Неоднозначно\n"); } } while(1); }
7.53. Пока я сам писал эту программу, я сделал две ошибки, которые должны быть весьма характерны для новичков. Про них надо бы говорить раньше, в главе про строки и в самой первой главе, но тут они пришлись как раз к месту. Вопрос: что печатает сле- дующая программа?
#include <stdio.h>
char *strings[] = { "Первая строка" "Вторая строка" "Третяя строка", "Четвертая строка", NULL };
void main(){ char **p; for(p=strings;*p;++p) printf("%s\n", *p); }
А печатает она вот что:
Первая строкаВторая строкаТретяя строка Четвертая строка
Дело в том, что ANSI компилятор Си склеивает строки:
"начало строки" "и ее конец"
если они разделены пробелами в смысле isspace, в том числе и пустыми строками. А в нашем объявлении массива строк strings мы потеряли несколько разделительных запятых! Вторая ошибка касается того, что можно забыть поставить слово break в операторе switch, и долго после этого гадать о непредсказуемом поведении любого поступающего на вход значения. Дело просто: пробегаются все случаи, управление проваливается из case
в следующий case, и так много раз подряд! Это и есть причина того, что в предыдущем