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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Си функция  (Прочитано 1006 раз)

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

Оффлайн streyz

  • Автор темы
  • Участник
  • *
  • Сообщений: 139
    • Просмотр профиля
Си функция
« : 25 Июля 2015, 00:54:14 »
Пример из кернигана:
/* getline: читает строку в s, возвращает длину */
int getline(char s[], int lim)
{
int c, i;
for (i = 0; i < lim-1 && (c = getchar()) != EOF && с != '\n'; ++i)
   s[i] = c;
if (c == 'n'; {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}

Какой смысл в этих строках:

if (c == 'n'; {
s[i] = c;
++i;
}
s[i] = '\0';

??

Оффлайн spk-ubuntu

  • Активист
  • *
  • Сообщений: 502
    • Просмотр профиля
Re: Си функция
« Ответ #1 : 25 Июля 2015, 01:14:38 »
похоже на очепятку, должно быть наверное:
if (c == '\n') {
s[i] = c;
++i;
}
т.е. если из цикла вышли потому что встретился символ перевода строки, то помещаем его тоже в результирующую строку.

Оффлайн streyz

  • Автор темы
  • Участник
  • *
  • Сообщений: 139
    • Просмотр профиля
Re: Си функция
« Ответ #2 : 25 Июля 2015, 01:22:46 »
Да это понятно, но s[i] никак далее не используется. Какой смысл в этих действиях?

Я новичек если что. :) Может это чтобы закрыть ячейку памяти, выделенную для массива?
« Последнее редактирование: 25 Июля 2015, 01:24:37 от streyz »

Оффлайн spk-ubuntu

  • Активист
  • *
  • Сообщений: 502
    • Просмотр профиля
Re: Си функция
« Ответ #3 : 25 Июля 2015, 12:30:14 »
Сформулируйте вопрос поконкретнее.
Или вот возьмите отладочную версию, откомпилируйте и посмотрите как это работает (добавлена функция print_debug_info(), которая после каждой записи в s[ i ] показывает что туда была записано и в какой строке исходного кода):
(Нажмите, чтобы показать/скрыть)

Оффлайн streyz

  • Автор темы
  • Участник
  • *
  • Сообщений: 139
    • Просмотр профиля
Re: Си функция
« Ответ #4 : 25 Июля 2015, 14:22:43 »
Вот полный код:

#include <stdio.h>
#define MAXLINE 1000 /* максимальный размер вводимой строки */
int getline(char linef], int MAXLINE);
void copy(char to[], char fromf]);
/* печать самой длинной строки */
main()
{
int len; /* длина текущей строки */
int max; /* длина максимальной из просмотренных строк */
char line[MAXLINE]; /* текущая строка */
char longest[MAXLINE]; /* самая длинная строка */
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) /* была ли хоть одна строка? */
printf("%s", longest);
return 0;
}
/* getline: читает строку в s, возвращает длину */
int getline(char s[], int lim)
{
int c, i;
for (i = 0; i < lim-1 && (c = getchar()) != EOF && с != '\n'; ++i)
s[i] = c;
if (c == '\n'; {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
/* copy: копирует из 'from' в 'to'; to достаточно большой */
void copy(char to[], char from[])
{
int i;i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}

Здесь видимо присутствуют ошибки, тк переменная line нигде не заполняется, а в функции getline переменная s[], содержащая строку никуда не передается и никак не используется.
Видимо содержимое s[] должно как-то передаваться в line, но я этого не вижу.

Оффлайн SkinnyJack

  • Любитель
  • *
  • Сообщений: 53
    • Просмотр профиля
Re: Си функция
« Ответ #5 : 25 Июля 2015, 15:14:18 »
вы передаёте в функцию указатель на массив символов, объявлённый где-то во вне, и функция этот массив по этому указателю меняет
Код: (c) [Выделить]
char test[4];
//в буффере test мусор test = {'x','f','g','a'}
int i = getline(test,4);
//ввод с клавиатуры "hey!"
//функция вернула 3; i = 3
//функция изменила буффер test, теперь test = {'h','e','y','\0'}

Делайте упражнения по порядку. K&R не стоит проскакивать галопом, это вам не dive into python, какой-нибудь.
« Последнее редактирование: 25 Июля 2015, 15:17:54 от SkinnyJack »

Оффлайн spk-ubuntu

  • Активист
  • *
  • Сообщений: 502
    • Просмотр профиля
Re: Си функция
« Ответ #6 : 25 Июля 2015, 15:38:43 »
...
while ((len = getline(line, MAXLINE)) > 0) // <-- вызываем getline(), в качестве первого параметра передаем line (адрес буфера, в котором нужно сохранить строку)
...
int getline(char s[], int lim)
{
  // здесь s - это по сути тот же line (тот же адрес буфера, в котором нужно сохранить строку)
  // поэтому когда записываем что-то в s[i] - мы записываем это в line[i]
  ...
}

Пользователь решил продолжить мысль 25 Июля 2015, 15:38:59:
Делайте упражнения по порядку. K&R не стоит проскакивать галопом, это вам не dive into python, какой-нибудь.
+1

Оффлайн streyz

  • Автор темы
  • Участник
  • *
  • Сообщений: 139
    • Просмотр профиля
Re: Си функция
« Ответ #7 : 25 Июля 2015, 18:35:42 »
Делайте упражнения по порядку. K&R не стоит проскакивать галопом, это вам не dive into python, какой-нибудь.

Спасибо, вот это я уже точно понял.

 

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