2013-03-14 75 views
2

代碼重寫,以更清晰指針和字符串,沒有對EOF

void indexe(char * line, unsigned ref) { 
    unsigned i = 0; 
    char word[128]; //(1) 
    //char * word; //(2) 
    while(*line) { 
    if(isalpha(*line)) 
     word[i++] = *line; //(1) 
     //*word++ = *line; //(2) 
    *line++; 
    } 
} 

int main(int argc, const char * argv[]) { 
    char line[128]; 
    FILE * f = fopen(argv[1], "r"); 
    unsigned x = 0; 
    while (fgets(line, 128, f)){ 
    indexe(line, ++x); 
    } 
    fclose(f); 
    return 0; 
} 

你好,我已經嘗試了上述兩種組合:

  1. word[] -> word[i++]
  2. *word -> *word++

整件事情完美無瑕,除非達到EOF,在這種情況下指針合成x出現分段錯誤,但不是數組語法。

我是一個C初學者,有人可以用初學者術語解釋這裏發生了什麼,也許建議一個解決方案來修復指針語法? (但主要是講解,請)

+0

你真的'#define str char *'?布萊什。 – 2013-03-14 20:49:20

+2

str和idx是什麼?這不是你的實際代碼。它也沒有關閉main。 – 2013-03-14 20:51:04

+0

我的不好,是的,idx是#define無符號的 – pouzzler 2013-03-14 20:53:10

回答

2

這個版本,張貼,是罰款:

void indexe(char * line, unsigned ref) { 
    unsigned i = 0; 
    char word[128]; //(1) 
    //char * word; //(2) 
    while(*line) { 
    if(isalpha(*line)) 
     word[i++] = *line; //(1) 
     //*word++ = *line; //(2) 
    *line++; 
    } 
} 

但是,如果電子書籍使用行代碼標記//(2)替代,你有這樣的:

char * word; //(2 
*word++ = *line; //(2) 

這只是寫入一個指針,你沒有用分配的內存初始化的情況。這是不允許的。您需要將它保存爲一個數組,或者使用類似malloc的內容來預留存儲空間。如果你想寫的功能,而不使用在所有的數組,代碼將是:

char *word = malloc(128); // reserve 128 bytes 
if (word == NULL) {   // these checks are important 
    fprintf(stderr, "Cannot allocate memory!"); 
    exit(EXIT_FAILURE); 
} 
...other stuff... 
free(word); 

還要注意的是:

*line++;

增量line,但解引用它(之前它的遞增)沒原因。

0

指針語法失敗,因爲您已經定義了一個指針char * word;但您尚未將其指向任何數據 - 您指向的內存可以位於任何位置。所以,當你執行以下語句:

*word++ = *line; 

你存儲的價值指向line的值由word指向。不幸的是,你不知道word指向哪裏。正如@teppic指出的那樣,你正在寫一個沒有被初始化爲分配內存的指針。

您可以將malloc作爲@teppic之前指出的內存。您還可以執行以下操作:

char reserve[128]; 
char * word = reserve; // could also have used &reserve[0] 

希望幫助!