免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1804 | 回复: 3
打印 上一主题 下一主题

The C programming language 1.9节中关于数组的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-06 10:53 |只看该作者 |倒序浏览
本节中的例子是关于读入并打印一个最大行,原码是这样的:

#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 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-09-06 11:12 |只看该作者
你的代码有错,s = c 应该是
s[i] = c
吧。
另外问题解答如下:
如果for循环逃出来的时候是i = lim - 1
那么c的值还是上次getchar的值,不可能是'\n',如果是上次就逃出来了
也不可能是lim - 1

论坛徽章:
0
3 [报告]
发表于 2008-09-06 11:21 |只看该作者
原帖由 一仓麻叶 于 2008-9-6 11:12 发表
你的代码有错,s = c 应该是s = c吧。
另外问题解答如下:
如果for循环逃出来的时候是i = lim - 1
那么c的值还是上次getchar的值,不可能是'\n',如果是上次就逃出来了
也不可能是lim - 1


谢谢大大,确实是复制的时候出错,这个是临时从网上下的电子书复制过来的,可能对复制加了点限制什么的。
我再仔细研究研究,希望还有更多的朋友指点。

PS:上面那个错误怎么都更正不过来……下次还是在家写好再拿来发了……

[ 本帖最后由 niexinnm 于 2008-9-6 11:26 编辑 ]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2008-09-06 17:15 |只看该作者
建议LZ把代码整理一下先,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP