2016-07-23 3 views
-3

Я новичок в языке программирования C, я очень смущен нулевым символом ('\0') на языке программирования C.Массивы символов в C?

На основании нижеприведенной программы длина разрешенного символа для линии равна 10 (MAXLINE определяется как 10). Вход, такой как Navindren длины 9, занимает индексы массива 0 до 8, при достижении нового символа линии он добавляется к индексу 9 и i увеличивается на 1. i: 10 сейчас и s[10] присваивается '\0', s[10] = '\0'.

Вот путаница, как это возможно, так как массиву выделяется только пространство из индекса 0 - 9? Я попытался обратиться к многим онлайн-ресурсам, но объяснений недостаточно.

Основные функции:

#include<stdio.h> 
#define MAXLINE 10 

int getline(char line[], int maxline); 
void copy(char to[], char from[]); 

main() { 
    int len;    /*current line length*/ 
    int max;    /*maximum length seen so far*/ 
    char line[MAXLINE];  /*current input line*/ 
    char longest[MAXLINE]; /*longest line saved here*/ 

    max = 0; 
    while ((len = getline(line, MAXLINE)) > 0) { 
     printf("%d\n", len); 
     if (len > max) { 
      max = len; 
      copy(longest, line); 
     } 
    } 

    if (max > 0) /* there was a line */ { 
     printf("%s", longest); 
    } else { 
     printf("No Lines Detected\n"); 
    } 

    return 0; 
} 

GetLine Функция:

int getline(char s[], int lim) { 
    int c; 
    int i; 

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

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

    s[i] = '\0'; 
    return i; 
} 

Функция копирования:

/*copy: copy `from` into `to`; assume to is big enough*/ 
void copy(char to[], char from[]) { 
    int i; 
    i = 0; 

    while ((to[i] = from[i]) != '\0') { 
     ++i; 
    } 
} 
+4

's [10]', который является 'lines [10]', не должен быть доступен (не читать и не писать), поскольку он выходит за пределы диапазона. Доступ к ней вызовет * неопределенное поведение *. – MikeCAT

+0

«как это возможно», потому что ваш компилятор С слишком ленив, чтобы генерировать код, чтобы проверить, не превышает ли индекс этот параметр? Все, что может случиться, когда вызывается * неопределенное поведение *. – MikeCAT

+0

Это значит, что изображения не будут отображаться? – naveenath

ответ

2

getline функция останавливается либо когда i достигает 9 или когда следующий байт читать файл - '\n' , Вы не можете иметь оба условия true в конце цикла, поэтому '\n' добавляется только в том случае, если i меньше 9, поэтому недопустимая позиция s[10] никогда не сохраняется.

Давайте предположим, что входной файл содержит байты:

+---+---+---+---+---+---+---+---+---+---+ 
| N | a | v | i | n | d | r | e | n |\n | 
+---+---+---+---+---+---+---+---+---+---+ 

Вот шаги, выполняемые getline():

  • i = 0 (заявление инициализации петли, выполняется один раз)
  • i < 9 -> правда
  • c = getchar() ->c получает 'N'
  • c != EOF -> истинная
  • c != '\n' -> истинная
  • s[i] = c ->s[0] получает 'N'
  • i++ ->i теперь 1

Цикл повтор ет вышеописанные шаги, пока s[8] не получает 'n' и i увеличивается на 9.

Окончательные шаги:

  • i < 9 -> ложно, происходит выход из цикла.
  • if (c == '\n') -> false, c содержит 'n', а не '\n', строка перевода не читается. if филиал пропущен.
  • s[i] = '\n' ->s[9] получает нулевой байт, '\0'.
  • return i; -> возвращается вызывающему абоненту значение 9.

Существует действительно проблема в вашей реализации getline(): вы передаете аргумент для размера массива назначения, но код использует жёстко прописанное значение MAXLINE вместо этого.

Помимо этой проблемы, поведение довольно похоже на поведение fgets(). Вы намеревались это сделать так, или вы намеревались читать строку без обратной линии, как это делала устаревшая небезопасная функция gets()?

+0

Я думаю, вы неправильно поняли вопросы, что произойдет, когда ввод, например, является строкой «Navindren», вы можете отлаживать код с помощью этого ввода и четко рассказать, что вы наблюдаете. – naveenath

+0

этот ответ уже дает вам подсказку, часть «отладить код» - это ваша собственная работа – artm

Смежные вопросы