String tokenizer-验证数组的奇怪行为

时间:2011-04-10 14:37:32

标签: c unix malloc segmentation-fault text-processing

编辑,将建议纳入代码并更新问题

我必须在程序中实现自动换行功能,并选择了

的贪心算法
//I use fread to take in the file in one bite, the parse the resulting array.  The 
//four lines below are from another function.
char *readBuffer= (char *) malloc(sizeof(char) * fileSize);    
int size= ftell(fp);
rewind(fp);
size_t result= fread(readBuffer, 1, size, fp);

int spaceLeft= termWidth;
int outputLines=0, tempLength, printCount-0;
char *temp, *newLine="\n";

temp= strtok(readBuffer, " "),
fputs(temp, stdout); //prints out a 11, when should be a 1, then exits

while ((outputLines < termHeight) && (temp != NULL)){
    strcat(temp, " ");
    tempLength= strlen(temp);

    if (spaceLeft > tempLength){
      fputs(temp, stdout);
      spaceLeft -= tempLength+1;
    } else {
      strcat(newLine, temp);
      spaceLeft= termWidth-(tempLength);
      outputLines++;
      newLines="\n";
    }
    temp= strtok(NULL, " ");
    printCount+= tempLength //debugger display
  }
}

使用此代码,我验证了文件已正确读入readBuffer   fputs(readBuffer, stdout)命令。然而,第一个fputs在屏幕上写了11,当它应该是1.然后它跳过while循环并退出。

OutputLines设置为0,termHeight是termHeight=termios.ws_row-1调用的结果。

如果temp正在向屏幕打印一个值,并且(outputLines = 0)&gt; termHeight,在这个例子中temp怎么可能为null?

1 个答案:

答案 0 :(得分:3)

部分问题可能是fgets只检索文件中的一行。 The man page描述了这一点。代码似乎期望它读取整个文件。因此,在处理完第一行之后,temp将为NULL(如果没有空格,则为单个标记)。

不知道您正在阅读的文本的长度,也不知道termHeighttermWidth的值,因此无法知道执行路径。但是,在处理该行之后,strlen()调用NULL temp值时可能会发生段错误。虽然这不是一个完整的解决方法,但while语句应该使用&&而不是||

while ((outputLines > termHeight) && (temp != NULL){

根据您希望如何处理它,您可能需要另一个fgets调用来在strtok返回NULL之后读取下一行。或者,也可以使用fread在一次调用中检索整个文件。