Язык программирования Си


         

Хрестоматия по программированию на Си в Unix- часть 327


- 327 - Си в UNIX

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, и так много раз подряд! Это и есть причина того, что в предыдущем




Содержание  Назад  Вперед