[tcpl2] Answer to Exercise 1-17

Answer to Exercise 1-17, "The C Programming Language", 2nd edition, Kernighan and Ritchie


I found Answer to Exercise 1-17 of  TCPL2 at this link. And for fun, I wrote mine. Here is my answer.

/** Answer to exercise 1-17, "The C Programming Language", 2nd edition
 * Write a program to print all input lines that are longer than 80 characters. 
 *
 * Story: I was thinking, what if requested input line length is not 
 * 80 characters, what if there is some limitation on the machine that array
 * line[]'s max length is limited, and requested line length is longer than
 * array maximumal-limited length. So in order to make the program more 
 * flexible, I give it a shot to hack it.
 * Desc: The answer is based on TCPL2 example 1-9, using its getline() and 
 * 	 copy() routines to achieve it. Technically, character include 
 * 	 invisible character like '\n', etc. So I didn't limit my program
 * 	 to general character 'a'-'z', etc.
 * Author: Dooit Lee <dooit.lee@gmail.com>
 * Date: Feb 23, 2012
 */
#include <stdio.h>

#define MAXLINE 10	/* maximum input line length */
#define LINELEN 80	/* print out line length */

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

/* print the longest input line*/
main()
{
	int len;	/* current line length */
	char line[MAXLINE]; /* current input line */
	char strstack[(LINELEN/(MAXLINE-1)) + 1][MAXLINE] = { 0 };
	int c, lenstat; /* lenstat is for line length statistic */
	int stackindex, i;

	lenstat = stackindex = 0;
	while ((len = getline(line, MAXLINE)) > 0) {
		/* getline() not finish reading a line yet */
		if (len == MAXLINE - 1 &&
		    line[len-1] != '\n' &&
		    (c = getchar()) != EOF) {
			ungetc(c, stdin);  /* put back character c to stdin */
			if (lenstat > LINELEN) {
				printf("%s", line);
			} else {
				copy(strstack[stackindex++
					      % ((LINELEN/(MAXLINE-1))+1)], 
				     line);
				if (stackindex * (MAXLINE-1) > LINELEN) {
					for (i = 0; i < stackindex; i++) {
						printf("%s", strstack[i]);
					}
					stackindex = 0;
				}
			}
			lenstat += len;
			continue; /* continue to read current unfinished line */
		} else {
			lenstat += len;
			if (lenstat > LINELEN) {
				if (stackindex != 0) {
					for (i = 0; i < stackindex; i++)
						printf("%s", strstack[i]);
					stackindex = 0;
				}
				if (line[len-1] == '\n')
					line[len-1] = '\0';
				printf("%s", line);
				printf(": %d\n", lenstat);
			}
			lenstat = 0;
			stackindex = 0;
		}
	}
}

/* getline: 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[])
{
	while ((*to++ = *from++) != '\0')
		;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值