免费注册 查看新帖 |

Chinaunix

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

[C] C程序设计语言练习1-16的答案有一句话看不懂 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-18 17:08 |只看该作者 |倒序浏览
C程序设计语言练习1-16:
修改打印最长文本行的程序的主程序main,使之可以打印任意长度的输入行的长度,并尽可能多的打印文本

原程序为:
#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;
}

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;
}

void copy(char to[], char from[])
{
                int i;

                i = 0;
                while ((to = from) != '\0')
                                ++i;
}

习题解答上的答案如下,看不明白的那句我将标记为红色
#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) {
                                printf("%d, %s", len, line);
                                if (len > max) {
                                                max = len;
                                                copy(longest, line);
                                }
                }
                if (max > 0)
                                printf("%s", longest);
                return 0;
}

int getline(char s[], int lim)
{
                int c, i, j;

                j = 0;
                for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i)
                                if (i < lim-2) {
                                                s[j] = c;
                                                ++j;
                                }
                if (c == '\n') {
                                s[j] = c;
                                ++j;
                                ++i;
                }
                s[j] = '\0';
                return i;
}

void copy (char to[], char from[])
{
                int i;

                i = 0;
                while ((to = from) != '\0')
                                ++i;
}
我们只对原来的主函数进行了一处修改,如下所示:
                                printf("%d, %s", len, line);
这条语句将把输入行的长度(len)和保存在数组line里的字符尽可能多的打印出来。
问题:这条语句只负责打印len和数组line里的字符,为什么说尽可能多的打印出来?怎样尽可能多的打印?
我们对函数getline也作了几处修改。首先,循环语句
for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i)
不再检查字符数是否超出数组s的限制-因为这一限制不再是for循环的终止条件之一了,现在的getline能返回任意长度的输入行的长度,并能存储尽可能多的输入行内容。
问题:怎样实现的尽可能多的存储输入行内容,存储输入行内容的是数组s,最多存储1000个字符,和原程序是一样的并没有增加阿

论坛徽章:
0
2 [报告]
发表于 2010-05-18 19:26 |只看该作者
能不能用代码的形式显示,看得真累
  1. #include <stdio.h>
  2. #define MAXLINE 1000

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

  5. main()
  6. {
  7.                 int len;
  8.                 int max;
  9.                 char line[MAXLINE];
  10.                 char longest[MAXLINE];

  11.                 max = 0;
  12.                 while ((len = getline(line,MAXLINE)) > 0)
  13.                                 if (len > max) {
  14.                                                 max = len;
  15.                                                 copy(longest, line);
  16.                                 }
  17.                 if (max > 0)
  18.                                 printf("%s", longest);
  19.                 return 0;
  20. }

  21. int getline(char s[], int lim)
  22. {
  23.                 int c, i;

  24.                 for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
  25.                                 s = c;
  26.                 if (c == '\n') {
  27.                                 s = c;
  28.                                 ++i;
  29.                 }
  30.                 s = '\0';
  31.                 return i;
  32. }

  33. void copy(char to[], char from[])
  34. {
  35.                 int i;

  36.                 i = 0;
  37.                 while ((to = from) != '\0')
  38.                                 ++i;
  39. }

  40. 习题解答上的答案如下,看不明白的那句我将标记为红色
  41. #include <stdio.h>
  42. #define MAXLINE 1000

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

  45. main()
  46. {
  47.                 int len;
  48.                 int max;
  49.                 char line[MAXLINE];
  50.                 char longest[MAXLINE];

  51.                 max = 0;
  52.                 while ((len = getline(line, MAXLINE)) > 0) {
  53.                                 printf("%d, %s", len, line);
  54.                                 if (len > max) {
  55.                                                 max = len;
  56.                                                 copy(longest, line);
  57.                                 }
  58.                 }
  59.                 if (max > 0)
  60.                                 printf("%s", longest);
  61.                 return 0;
  62. }

  63. int getline(char s[], int lim)
  64. {
  65.                 int c, i, j;

  66.                 j = 0;
  67.                 for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i)
  68.                                 if (i < lim-2) {
  69.                                                 s[j] = c;
  70.                                                 ++j;
  71.                                 }
  72.                 if (c == '\n') {
  73.                                 s[j] = c;
  74.                                 ++j;
  75.                                 ++i;
  76.                 }
  77.                 s[j] = '\0';
  78.                 return i;
  79. }

  80. void copy (char to[], char from[])
  81. {
  82.                 int i;

  83.                 i = 0;
  84.                 while ((to = from) != '\0')
  85.                                 ++i;
  86. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2010-05-18 19:29 |只看该作者
要实现的尽可能多的存储输入行内容。用动态数组

论坛徽章:
0
4 [报告]
发表于 2010-05-18 20:52 |只看该作者
回复 3# 0vk0


    谢谢你,我在FreeBSD从VIM里copy过来的,不知道如何弄成你那个形式,呵呵

论坛徽章:
0
5 [报告]
发表于 2014-02-13 12:55 |只看该作者
回复 1# lambert_fan


回答撸主你的问题:
   
   问题:这条语句只负责打印len和数组line里的字符,为什么说尽可能多的打印出来?怎样尽可能多的打印?

   答:数组line的最大长度是MAXLINE,当输入的字符的长度小于MAXLINE 时,打印的长度是实际长度len,当输入长度大于MAXLINE 时,打印的最大长度就是MAXLINE-1,需要去掉"\0",大于MAXLINE 的部分舍弃没有放到数组line里面,但实际输入字符的长度已经被记录下来了放在变量len里面。这就是我所理解的尽可能多打印以及怎样多打印。
   
  问题:怎样实现的尽可能多的存储输入行内容,存储输入行内容的是数组s,最多存储1000个字符,和原程序是一样的并没有增加阿

答:就是这个意思,尽可能多的存储就是说最大可以存储的字符量就是MAXLINE。

论坛徽章:
0
6 [报告]
发表于 2014-07-13 12:19 |只看该作者
75.int getline(char s[], int lim)

76.{

77.                int c, i, j;

78.

79.                j = 0;

80.                for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i)

81.                                if (i < lim-2) {

82.                                                s[j] = c;

83.                                                ++j;

84.                                }

85.                if (c == '\n') {

86.                                s[j] = c;

87.                                ++j;

88.                                ++i;

89.                }

90.                s[j] = '\0';

91.                return i;

92.}
为什么黄色部分是lim - 2 ?

论坛徽章:
0
7 [报告]
发表于 2014-11-26 10:48 |只看该作者
这个不对吧 当输入的小于数组的长度时 没显示
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP