这是一个打印最长行的程序.摘自K&R的c编程语言一书.

我的疑问是,代码的必要性是什么.

    if(c == '\n'){
     s[i]=c;
     ++i;
    }

在getLine()函数中.

#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',当遇到换行符时,循环仍将正确终止.但是,curr_len中存储的行的长度将不包括换行符.

这为什么会有问题呢?随后在main函数if (curr_len > max_len)中的比较将是有缺陷的.如果长度计算中不包括换行符,则找到的最长行可能不正确.

请考虑以下场景:

输入:

Line 1
Line 2
Line 3

如果从长度计算中排除换行符,则每行的长度为:

Line 1: 6 (_excluding newline_)
Line 2: 6 (_excluding newline_)
Line 3: 6 (_excluding newline_)

在这种情况下,程序将错误地得出第一行是最长行的结论,因为它与第二行和第三行的长度相同.然而,第三行实际上是最长的行,因为它有一个额外的换行符.

通过在长度计算中包括换行符,程序确保比较if (curr_len > max_len)准确地识别最长的行.它将换行符计算为行长度的一部分,允许将第3行正确标识为长度为7(_包括换行符)的最长行.

因此,为了正确地说明换行符并确保在查找最长行时进行准确的比较,必须包括代码片段if (c == '\n') { ... }.

希望现在天气晴朗!

C++相关问答推荐

如何用C(使用两个s补数算术的32位程序)计算

我可以动态分配具有空类型函数的矩阵吗?

从C函数调用asm函数时生成错误的BLX指令(STM32H753上的gcc)

当打印字符串时,为什么在c中没有使用常量限定符时我会收到警告?

如何创建由符号组成的垂直结果图形?

数据包未从DPDK端口传输到内核端口

测量ARM MCU中断延迟的问题

为什么I2C会发送错误的数据?

拥有3x3二维数组并访问数组[1][3]等同于数组[2][0]?

为什么即使在强制转换时,此代码也会溢出?

如何在C语言中正确打印图形

在句子中转换单词的问题

在C中包装两个数组?

GCC错误,共享内存未定义引用?

CS50判断灯泡运动的问题,判断时多出一个灯泡,但不在终端上

浮点正零何时不全为零?

C语言中的指针和多维数组

无法将字符串文字分配给 C 中的字符数组

全局变量 y0 与 mathlib 冲突,无法编译最小的 C 代码

仅使用其内存地址取消引用 C 中的 struct