编辑,将建议纳入代码并更新问题
我必须在程序中实现自动换行功能,并选择了
的贪心算法//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?
答案 0 :(得分:3)
部分问题可能是fgets
只检索文件中的一行。 The man page描述了这一点。代码似乎期望它读取整个文件。因此,在处理完第一行之后,temp将为NULL(如果没有空格,则为单个标记)。
不知道您正在阅读的文本的长度,也不知道termHeight
或termWidth
的值,因此无法知道执行路径。但是,在处理该行之后,strlen()
调用NULL temp
值时可能会发生段错误。虽然这不是一个完整的解决方法,但while
语句应该使用&&
而不是||
:
while ((outputLines > termHeight) && (temp != NULL){
根据您希望如何处理它,您可能需要另一个fgets
调用来在strtok
返回NULL之后读取下一行。或者,也可以使用fread
在一次调用中检索整个文件。