Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Ci. Почему все таки происходит выход за грани  (Прочитано 1656 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Kozak Illya

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
/* getlines: считует строку в s, возвращает ее длину */
int getlines(char s[])
{
   int c, i;


   for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i)
      {
      if(i < MAX_LINE - 1 ) /* защита от выхода за границы массива. MAX_LINE -размер массива */
         s[i] = c;
      else ;
      }
   if (c == '\n')
      {
      s[i] = c;
      ++i;
      }
      s[i] = '\0';
   return i ;
}
А если делаю так
int getlines(char s[])
{
   int c, i;


   for (i = 0; (c = getchar()) != EOF && c != '\n' && i < MAX_LINE - 1; ++i)
      {
         s[i] = c;
      }
   if (c == '\n')
      {
      s[i] = c;
      ++i;
      }
      s[i] = '\0';
   return i ;
}

то норм

Хочу сделать так чтобы длина строки подсчитывалась независимо от того хватает ли размера массива чтобы ее поместить.

Я создал эту тему не потому что не могу реализовать задуманное, а потому что не понимаю почему после того как в первом варианте в цикле for происходит проверка на выход за границы массива, выход все таки происходит?
« Последнее редактирование: 15 Ноября 2010, 18:43:04 от Kozak Illya »

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
      else  break;
Извините, я все еще учусь

Оффлайн Kozak Illya

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
else  break; виходит из цыкла for
А я хочу чтоб for добегал до конца с пустым оператором и выдавал значение i.

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
До какого конца? А если вообще не встретится EOF или '\n'? До бесконечности?
Извините, я все еще учусь

Оффлайн Kozak Illya

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
Дело не в том чтобы сделать код максимально безопасным, а в том что я не могу понять почему не работает мой if else вариант?

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
А я не могу понять зачем у тебя строчка
 else ;
в коде. Может объяснишь?
Извините, я все еще учусь

Оффлайн Kozak Illya

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
Чтобы ничего не делать, и делать это явно   :D
без нее все равно выход за пределы  :-\

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Там у Вас после цикла стоит оператор if, в котором есть запись в s [ i ].
Значение i здесь может быть любым, в том числе больше MAX_LINE.

Я имею в виду, сразу после
Цитировать
else ;
идет закрывающая фигурная скобка.
Так вот, эта скобка завершает цикл for.
Оператор
Цитировать
if (c == '\n')
выполняется один раз после окончания цикла.
В нем есть обращение к s [ i ].


PS. Форматирование кода ужасное.

« Последнее редактирование: 15 Ноября 2010, 20:35:33 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
/* mygetline: считывает строку в s, возвращает ее длину  - в однобайтовой кодировке*/
int mygetline(char s[])
{
   int c, i, n;
   i = 0;
   while(1)
   {
     c = getchar();
     if( c == EOF) break;
     if(i < MAX_LINE - 1 ) /* записывать только первые MAX_LINE - 1 байт */
        s[i] = c;
     if( c == '\n') break;
     i++;
   }
   n = i++;
   if (i > MAX_LINE - 1) i = MAX_LINE - 1;
   s[i] = '\0';
   return n ;
}
Извините, я все еще учусь

Оффлайн smart__

  • Любитель
  • *
  • Сообщений: 77
    • Просмотр профиля
    • ООО "ИнфоЦентр"
Вот вроде во всех средствах разработки есть отладчик. Воспользоваться не судьба?

Оффлайн Kozak Illya

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
Re: Ci. Почему все таки происходит выход за грани
« Ответ #10 : 15 Ноября 2010, 22:02:17 »
Я использую gedit & gcc. Буду осваивать gdb если он поможет в дальнейшем не делать таких ошибок.
Над примером просидел с час. Смотрел в одну строчку не видя других (Аж стыдно)  :-[. Спасибо за терпение.

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
Re: Ci. Почему все таки происходит выход за грани
« Ответ #11 : 15 Ноября 2010, 22:10:07 »
Так работает?
(как обрабатывать '\n'- это ваша проблема  ;) )
Извините, я все еще учусь

Оффлайн Kozak Illya

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
Re: Ci. Почему все таки происходит выход за грани
« Ответ #12 : 16 Ноября 2010, 09:22:19 »
GDB открыл мне глаза на поиск ошибок в моих поделках. Я думал его использование будет трудной вещью.
У меня есть архив с статьями с закрывшегося linfoline.homedns.org
(Нажмите, чтобы показать/скрыть)
Кому надо обращайтесь.

Оффлайн mkarasik

  • Участник
  • *
  • Сообщений: 163
    • Просмотр профиля
Re: Ci. Почему все таки происходит выход за грани
« Ответ #13 : 16 Ноября 2010, 22:31:21 »
GDB открыл мне глаза на поиск ошибок в моих поделках.

А это значит, что ты дорос до ddd. А там и до нормальных IDE рукой подать. Например eclipse CDT. :)

Оффлайн Kozak Illya

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
Re: Ci. Почему все таки происходит выход за грани
« Ответ #14 : 18 Ноября 2010, 11:26:25 »
Говорят для программирования круче чем EMACS только вареные яйца. Думаю со временем перейду на него. Для собственного развития буду учить Lisp (Главное чтоб жена из дома не выгнала  :D)

 

Страница сгенерирована за 0.022 секунд. Запросов: 21.