2017-08-01 02:34:40 +0000   |     java c code complete good practice   |   Viewed times   |    

什么时候用while?

一个大的基本准则:

while比较适合用来写这种循环:我知道循环的终止条件,但不太确定有多少步数。

处理比较复杂的判断条件,不要慌。

对于比较复杂的while,要理清头绪,什么是循环终止条件。什么是其他附属条件。要分清主次。循环终止条件是主,其他附属条件是次。

举个例子,

我有一个长度为lim的数组。从一个文件读入一行,写入这个数组,并返回这一行的长度。如果写不下,能写多少就写多少。

这里判断条件起码涉及几个值,

  1. 文件末尾EOF
  2. 换行符\n
  3. 数组的长度

还有一些搅屎棍一样的细节,

  1. C语言中的字符串都需要用\0标明结尾

这些细节混在一起,让while有点复杂。但如果抓住 循环终止条件 这个重点,思路就清楚了,

  1. 循环终止条件:只有遇到文件末尾EOF以及换行符\n才终止读入下一个字符。
  2. 其他附属条件:数组有没有越界,以及在末尾留出位置给\0这样的细节。
static int getlongline(char s[], int lim) {
    char c;
    int len = 0;
    // 只有遇到文件末尾或者换行符才结束读入下一个字符
    while ((c = getchar()) != EOF && c != '\n') {
        if (len < lim - 1) { s[len] = c; } // 读入了以后,往不往数组里写,取决于数组的边界
        ++len;
    }
    if (c == '\n') { // 如果是停在了换行符上,还要试试看数组能不能写的下这个换行符
        if (len < lim - 1) { s[len] = '\n'; }
        ++len;
    }
    if (len < lim) { // 在字符串的最后插入`\0`标记
        s[len] = '\0';
    } else {
        s[lim-1] = '\0';
    }
    return len;
}