2016-07-23 46 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