我的问题是关于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?我花了一个多小时盯着这个问题,我似乎无法掌握正在发生的事情。
答案 0 :(得分:0)
以下是输入在for循环中的工作方式。
在for循环之前,数组s
是空的(ish。它充满了该内存中的任何垃圾)。如果您输入单个a
并按Enter键,则for循环将经过2个字符'a'
和'\n'
。对于'a'
,变量c
从for循环参数中的getchar()变为'a'
,并保存在i
点(即0){ {1}}。所以,现在是数组s
s
和s[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;
}
一部分。)