2013-03-14 40 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] 

希望帮助!