2016-07-23 42 views
-3

我是C编程语言的初学者,我对C编程语言中的空字符('\0')非常困惑。C中的字符数组?

根据以下程序,一行的允许字符长度为10MAXLINE定义为10)。长度为9的输入如Navindren占用阵列索引08,无论何时达到新的行字符,它都被添加到索引9并且i被增加1i现为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]',这是'线[10]',一定不能被访问(没有读取也不写),因为它是外的范围。访问它会调用*未定义的行为*。 – MikeCAT

+0

“这怎么可能”,因为你的C编译器懒得生成代码来检查索引是否超出范围?当* undefined behavior *被调用时可能发生任何事情。 – MikeCAT

+0

这意味着它不会显示错误? – naveenath

回答

2

getline功能停止要么当i达到9或当从读出的下一个字节该文件是'\n' 。在循环结束时,您不能同时拥有两个条件,因此只有在i小于9时才会添加'\n',因此无效位置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