c - 究竟是什么打破了 main 中的 while 循环?
问题描述
究竟是什么打破了这段代码中的 while 循环?这是来自 C 创建者的《The C Programming Language 》一书的代码。这是 1.9 节中的代码。我想int len
它总是大于 0,但是当我编译这段代码时,当我按下 Ctrl+Z(Windows 的 EOF)时,while 循环会中断。
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
int mgetline(char line[], int maxline);
void copy(char to[], char from[]);
/* print the longest input line */
main() {
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */
max = 0;
while ((len = mgetline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
if (max == len)
copy(longest, line);
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}
/* mgetline: read a line into s, return length */
int mgetline(char s[], int lim) {
int c, i;
for (i = 0; i < lim - 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 to[], char from[]) {
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
解决方案
循环 1:(在copy
)
C 中的字符串按惯例以 NUL 结尾。NUL 是一个char
值为 0 的特殊值。
表达式的值to[i] = from[i]
是 的新值to[i]
。
达到 NUL 时为 0,循环退出。
循环 2:(在main
)
同样, 的值len = mgetline(line, MAXLINE)
是 的新值len
。如果mgetline
没有读取字符时返回 0,则返回 0。所以那个循环退出了。
推荐阅读
- couchdb - 如何安装 couchdb 2.3.0 版
- angular - 无法将更新的信息从提供商传递到页面
- c# - 如何动态构建 Func<>?
- mysql - 优化 MySQL CREATE TABLE 查询
- python - 有没有一种简单的方法可以以树的形式打印一个类的层次结构?
- oracle - 在行触发器中取消插入值
- mule - Mule 4:如果使用属性,则 Cloudhub 部署失败
- javascript - 未捕获的类型错误:item.getData 不是函数
- jacoco - 如何排除 jacoco:structure 中的某些类
- mongoose - UpdateOne 返回一个猫鼬对象而不是文档