C语言getLine()函数内部if语句的作用必要性技术咨询
关于K&R最长行打印程序中getLine函数if语句的作用解释
这是K&R所著《The C Programming Language》一书中的最长行打印程序:
#include<stdio.h> # define MAXLINE 1000 /*maximum length of the input line*/ int getLine(char s[],int line); void copy(char from[],char to[]); int main(){ int curr_len; //current line length int max_len = 0; // maximum line length so far char curr_line[MAXLINE]; // Current input line char longest_line[MAXLINE]; // maximum line saved so far while((curr_len = getLine(curr_line,MAXLINE))>0){ if(curr_len>max_len){ copy(curr_line,longest_line); //save the longest line max_len = curr_len; } } if(max_len>0){ printf("%s\n",longest_line); } return 0; } /* getline: read a line into s, return length*/ int getLine(char s[],int maxline){ int c,i; for(i=0;i<maxline-1 && (c = getchar())!=EOF && c!='\n';++i){ s[i]=c; if(c == '\n'){ s[i]=c; ++i; } } s[i]='\0'; return i; } /* copy: copy 'from' into 'to'; assume to is big enough */ void copy(char from[],char to[]){ int i=0; while((to[i] = from[i])!='\0'){ ++i; } }
我的疑问是:getLine()函数中的这段代码
if(c == '\n'){ s[i]=c; ++i; }
有何必要性?请解释该if语句在getLine()函数中的作用。
首先要指出,你贴的这段getLine函数代码存在小失误——if(c == '\n')被放在了for循环体内部,但循环的终止条件里已经包含了c!='\n',导致这个if分支永远不会被执行到。正确的K&R原版代码里,这个if语句是在for循环结束之后的。
不管代码位置的问题,这个if语句的核心作用有两个:
- 保留输入的换行格式:当输入行以
\n结尾时,把这个换行符存入目标字符串数组,这样最终输出的最长行能和输入保持完全一致的格式(包含换行),不会变成没有换行的生硬文本。 - 统计准确的行长度:换行符本身属于行的一部分,需要把它计入返回的行长度值中,确保程序统计的长度是包含换行符的实际行长度,避免长度少算1。
举个实际例子:
- 如果没有这个if语句,输入
hello\n时,for循环会在读取到o后停止(下一个字符是\n,不满足循环条件),数组里只会存储hello,返回长度为5; - 加上这个if语句后,循环结束后检测到
c是\n,会将其存入数组的第5位,同时把长度计数器i加1变成6,返回长度6,数组内容为hello\n\0,输出时能正确显示换行。
另外要注意,如果输入行的长度超过了MAXLINE-1,循环会因数组容量限制提前终止,此时即使后面还有换行符,也不会被读取和存储,这是程序本身的长度限制设计。
内容的提问来源于stack exchange,提问作者SOHAN D P
相关产品推荐
相关产品推荐

