Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 26.05.2009, 15:52   #1
hukola
Новичок
Джуниор
 
Регистрация: 26.05.2009
Сообщений: 9
По умолчанию Пример из книги Керниган, Ричи. Язык C. Массивы

Код:
#DEFINE  MAXLINE  1000 /* MAXIMUM INPUT
       LINE SIZE */
 MAIN()  /* FIND LONGEST LINE */
 {
 INT LEN; /* CURRENT LINE LENGTH */
 INT MAX; /* MAXIMUM LENGTH SEEN SO FAR */
 CHAR LINE[MAXLINE]; /* CURRENT INPUT LINE */
 CHAR SAVE[MAXLINE]; /* LONGEST LINE, SAVED */

 MAX = 0;
 WHILE ((LEN = GETLINE(LINE, MAXLINE)) > 0)
     IF (LEN > MAX) {
    MAX = LEN;
    COPY(LINE, SAVE);
     }
     IF (MAX > 0)   /* THERE WAS A LINE */
    PRINTF("%S", SAVE);
 }
 GETLINE(S,LIM) /* GET LINE INTO S,RETURN LENGTH */
 CHAR S[];
 INT LIM;
 {
    INT C, I;

    FOR(I=0;I<LIM-1 && (C=GETCHAR())!=EOF && C!='\N';++I)
    S[I] = C;
    IF (C == '\N')  {
  S[I] = C;
  ++I;
    }
    S[I] = '\0';
    RETURN(I);
 }

 COPY(S1, S2)    /* COPY S1 TO S2;
               ASSUME S2 BIG ENOUGH */
 CHAR S1[], S2[];
 {
 INT I;

 I = 0;
 WHILE ((S2[I] = S1[I] != '\0')
    ++I;
 }
Всем привет.
В коде несколько опечаток. Это со страницы lib.ru
Собственно в чем вопрос:
Как заполняется массив line? В функцию передаю пустой одном. массив размером 1000, но когда ставлю после цикла while строку printf("%s",line);становится понятно что массив заполнен строкой. Не укладывается в голове как, знатоки объясните пожалуйста.
hukola вне форума
Старый 26.05.2009, 16:16   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от hukola
В функцию передаю пустой одном. массив размером 1000, но когда ставлю после цикла while строку printf("%s",line);становится понятно что массив заполнен строкой. Не укладывается в голове как, знатоки объясните пожалуйста.
Все просто: строка - это массив символов.
Код:
 CHAR LINE[MAXLINE];
- строка длиной в MAXLINE.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 26.05.2009, 17:06   #3
hukola
Новичок
Джуниор
 
Регистрация: 26.05.2009
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Sazary Посмотреть сообщение
Все просто: строка - это массив символов.
Код:
 CHAR LINE[MAXLINE];
- строка длиной в MAXLINE.
Это понятно.
LINE массив длиной в MAXLINE, но где конкретно он заполняется? В функции GETLINE я так понимаю, но как?
массив |с|т|р|о|к|а|
в каком месте он заполнился этой строкой?
hukola вне форума
Старый 26.05.2009, 17:11   #4
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

у меня есть эта книга.. классика... там же абсолютно прозрачный код.. и комментарии..
Код:
  FOR(I=0;I<LIM-1 && (C=GETCHAR())!=EOF && C!='\N';++I)
    S[i] = C;
    IF (C == '\N')  {
  S[i] = C;
тут заполняется массив LINE
Uguu~

Последний раз редактировалось __STDC__; 26.05.2009 в 17:15.
__STDC__ вне форума
Старый 26.05.2009, 17:11   #5
hukola
Новичок
Джуниор
 
Регистрация: 26.05.2009
Сообщений: 9
По умолчанию

Код:
GETLINE(LINE, MAXLINE)
Здесь я вызвал функцию с параметрами LINE - пустой одном массив длиной 1000
MAXLINE-int 1000.
Код:
 GETLINE(S,LIM) /* GET LINE INTO S,RETURN LENGTH */
 CHAR S[];
Здесь массив S[] "перенял" характеристики и наполнение массива LINE.
Код:
S[i] = C;
Заполнение массива S[]
Функция возвращает счетчик, то есть кол-во символов.
Получается, что вместе с массивом S[] заполнился и LINE[], я все правильно понимаю?
hukola вне форума
Старый 26.05.2009, 17:12   #6
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

Хм.. почитайте там внимательней... про формальные и фактические параметры (аргументы и параметры)
во втором издании страница 40... пункт 1.8 (заставили копаться в книгах.. какой вы нехороший =) )
Uguu~
__STDC__ вне форума
Старый 26.05.2009, 17:15   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Функция getline считывает данные в строку.
Только вот вызывается она иначе:
Код:
cin.getline(string,size);
Считает в переменную string (типа char*) из потока size символов

И вообще, почему капсом код написан? Он ж не скомпилится )
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 26.05.2009, 17:16   #8
hukola
Новичок
Джуниор
 
Регистрация: 26.05.2009
Сообщений: 9
По умолчанию

Цитата:
Сообщение от __STDC__ Посмотреть сообщение
Хм.. почитайте там внимательней... про формальные и фактические параметры (аргументы и параметры)
во втором издании страница 40... пункт 1.8 (заставили копаться в книгах.. какой вы нехороший =) )
в языке "C" все аргументы функций передаются
"по значению". это означает, что вызванная функция получает
значения своих аргументов с помощью временных переменных
/фактически через стек/, а не их адреса. Это приводит к не-
которым особенностям, отличным от тех, с которыми мы сталки-
вались в языках типа фортрана и PL/1, использующих "вызов по
ссылке ", где вызванная процедура работает с адресом аргу-
мента, а не с его значением.
Главное отличие состоит в том, что в "C" вызванная функ-
ция не может изменить переменную из вызывающей функции; она
может менять только свою собственную временную копию.
hukola вне форума
Старый 26.05.2009, 17:16   #9
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

Цитата:
Сообщение от Sazary Посмотреть сообщение
Функция getline считывает данные в строку.
Только вот вызывается она иначе:
Код:
cin.getline(string,size);
Считает в переменную string (типа char*) из потока size символов
там не библиотечная.. своя используется)

**
точнее страница 41 со слов "С массивами другая история..."
Uguu~
__STDC__ вне форума
Старый 26.05.2009, 17:19   #10
hukola
Новичок
Джуниор
 
Регистрация: 26.05.2009
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Sazary Посмотреть сообщение
Функция getline считывает данные в строку.
Только вот вызывается она иначе:
Код:
cin.getline(string,size);
Считает в переменную string (типа char*) из потока size символов

И вообще, почему капсом код написан? Он ж не скомпилится )
http://lib.ru/CTOTOR/kernigan.txt
у меня все "нормально" набрано и все компилится. С оригинала правдоподобней.
там еще несколько опечаток в коде
hukola вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
массивы(язык Си) bars1984 Помощь студентам 14 11.05.2009 21:15
Пример из книги Cpluser Общие вопросы .NET 7 13.04.2009 14:39
Пример из книги,помогите найти ошибку. ANTI Win Api 4 04.06.2008 23:59