- 论坛徽章:
- 0
|
本节中的例子是关于读入并打印一个最大行,原码是这样的:
#include <stdio.h>
#define MAXLINE 1000 /* 最大输入行的大小*/
int getline (char line[ ], int maxline );
void copy ( char to[ ], char from [] );
/* 打印最长的输入行*/
main ( )
{
int len; /* 当前行长度*/
int max; /* 至目前为止所发现的最长行的长度*/
char line[MAXLINE]; /* 当前输入的行*/
char longest[MAXLINE]; /* 用于保存最长的行*/
max = 0;
while ( ( len = getline (line, MAXLINE) ) > 0 )
if (len > max) {
max = len;
copy ( longest, line );
}
if (max > 0) /* 有一行*/
printf ("%s" , longest ) ;
return 0 ;
}
/* getline:将一行读入s中并返回其长度*/
int getline (char s [ ], int lim)
{
int c, i;
for (i = 0; i < lim -1 && (c = getchar ( ) ) != EOF && c != '\n'; ++i )
s = c;
if (c == '\n' ) {
s = c;
++i;
}
s = '\0';
return i;
}
/* copy:从from拷贝到to; 假定to足够大*/
void copy ( char to [ ], char from [ ])
{
int i;
i = 0;
while ( ( to[ i ] = from [ i ]) != '\0')
++i;
}
我的问题在这几句上:
int getline (char s [ ], int lim)
{
int c, i;
for (i = 0; i < lim -1 && (c = getchar ( ) ) != EOF && c != '\n'; ++i )
s = c;
if (c == '\n' ) {
s = c;
++i;}
s = '\0';
return i;
}
i<lim-1
那么
if (c == '\n' ) {
s = c;
++i;
}
就有可能将\n放在s[lim-1]的位置,
而后面的s = '\0';又把\0放到的s[lim]的位置。
对数组下标从0开始来讲,不是最多到s[lim-1]吗?最后的\0岂不是越界了?
在此节的习题1_16中,习题解答上作者给出的例程,用的是i<lim-2,
他的解释是s[lim-2]放可能的\n,而s[lim-1]放\0。
此处小弟始终不太理解,1.9中的例子是我哪里没理解对呢?请大家帮忙!!多谢了。
[ 本帖最后由 niexinnm 于 2008-9-6 11:24 编辑 ] |
|