You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:22:48