K& R - 第1.9节 - 字符数组(关于getline函数)

时间:2015-03-10 08:36:37

标签: c arrays

我的问题是关于Kernighan和Ritchie一书中1.9节字符数组的一些代码。代码如下:

#include <stdio.h>
#define MAXLINE 1000 /* maximum input line size */

int getline(char line[], int maxline);
void copy(char to[], char from[]);

/* print 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 = getline(line, MAXLINE)) > 0)
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    if (max > 0) /* there was a line */
        printf("%s", longest);
    return 0;
}

/* get line: read a line into s, return length */
int getline(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;
}

我的问题是关于getline函数。现在从我的命令行看下面的输出作为参考:

me@laptop
$ characterarray.exe
aaaaa
a
aaaaaa
^Z
aaaaaa

me@laptop
$

当我输入第一个字符'a'时,字符'a'是否通过for循环,在getline函数中,并初始化s [0] - s [998] = a?问题的第二部分是程序离开for循环并转到

s[i] = '\0'
return i;

不会初始化s [998] ='\ 0'并且返回整数是998?我花了一个多小时盯着这个问题,我似乎无法掌握正在发生的事情。

2 个答案:

答案 0 :(得分:0)

以下是输入在for循环中的工作方式。

在for循环之前,数组s是空的(ish。它充满了该内存中的任何垃圾)。如果您输入单个a并按Enter键,则for循环将经过2个字符'a''\n'。对于'a',变量c从for循环参数中的getchar()变为'a',并保存在i点(即0){ {1}}。所以,现在是数组s ss[0] = 'a'的其余部分都有随机垃圾。

然后来自getchar()的s变为c。由于'\n'检查,这会停止for循环。 if语句为c != '\n's[i]为1,i'\n'最多为2。

现在i

s

s[0] = 'a' s[1] = '\n'getline设为s[2],这是字符串字符的结尾,然后返回'\0'

您的最终结果是

i

s[0] = 'a' s[1] = '\n' s[2] = '\0',你的长度是2.

答案 1 :(得分:0)

字符'a'不会通过for循环。看这里:

for (i=0; i<lim-1 && ((c=getchar()) != EOF) && c != '\n' ; ++i) 

c = getchar()是你的程序停止并等待用户输入的地方 - 不只是一次,而是循环!这是继续for循环的条件,每次检查时,都会调用getchar()。循环一次只有一个char。每次将char添加到数组的当前末尾时(由i表示),并且在输入换行符号或达到限制大小时循环中断。这是非常紧凑的代码,但它是一种oldschool C编码,这些轻松的日子不是很容易阅读。它可以分为以下几部分:

i = 0;
while(i < lim - 1) {
    c = getchar();
    if (c == EOF || c == '\n') break;
    s[i] = c;
    ++i;
}
s[i] = '\0'; 
return i;

(我也不认为字符串中需要包含换行符号,所以我省略了

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

一部分。)