关于《C程序设计语言》中某段程序的有关问题!

关于《C程序设计语言》中某段程序的问题!!
#include <stdio.h>
  #define MAXLINE 1000 /* maximum input line length */

  int getline(char line[], int max);
  int strindex(char source[], char searchfor[]);

  char pattern[] = "ould"; /* pattern to search for */

  /* find all lines matching pattern */
  main()
  {
  char line[MAXLINE];
  int found = 0;

  while (getline(line, MAXLINE) > 0)
  if (strindex(line, pattern) >= 0) {
  printf("%s", line);
  found++;
  }
  return found;
  }

  /* getline: get line into s, return length */
  int getline(char s[], int lim)
  {
  int c, i;

  i = 0;
  while (--lim > 0 && (c=getchar()) != EOF && c != '\n')
  s[i++] = c;
  if (c == '\n')
  s[i++] = c;
  s[i] = '\0';
  return i;
  }

  /* strindex: return index of t in s, -1 if none */
  int strindex(char s[], char t[])
  {
  int i, j, k;

  for (i = 0; s[i] != '\0'; i++) {
  for (j=i, k=0; t[k]!='\0' && s[j]==t[k]; j++, k++)
  ;
  if (k > 0 && t[k] == '\0')
  return i;
  }
  return -1;
  }

全部程序如上图 选自《The C Programming Language》Chapter 4 Functions and Program Structure 
里面的第一节1.Basics of Functions 

这个函数的功能是 从多行文字中 找到包含字符串“ould”的行 并把这些行逐个打印出来


我有以下问题:

1.如何确保getline函数每次读取的是下一行文字,而不是从整段文字重头开始读?(可能和getchar函数的性质有关)

2.程序可以编译,运行后,通过“shift+回车”来换行输入多行文字。但是一旦输入的行中含有“ould”,那“shift+回车”按下后,就不再是换行,而是自动输出了刚才输入的含有“ould”的行。
这样程序本身就失去了原先定义的功能。原因是什么?怎样才能解决并实现最初定义的功能呢?(我是在WIN下用C-free来编译,运行在类似CMD的环境里)

3.假设以上功能都能实现,打印出来的多行文字,能否自动换行,会不会都在一行上挤成一块呢?
我的担心源于printf("%s", line);里面没有'\n'符号




请各位大虾指教!

------解决方案--------------------
1、getchar是从stdin中取字符,那么字符取出后stdin中就没有那个字符了,对应的是下一个字符
2、可以使用重定向、管道等输入方式
3、在getline方法中已经添加了'\n',所以不会打印在一行上。

if (c == '\n')
s[i++] = c;
------解决方案--------------------
while (--lim > 0 && (c=getchar()) != EOF && c != '\n')

c != '\n' 当有会车时,就结束了。。如果不需要回车结束,就把这个给去掉!!!以EOF来结束。。