代码改变世界

Pointers and Arrays_3

2017-02-09 18:08  星星之火✨🔥  阅读(216)  评论(0)    收藏  举报

1、重写TCPL Reading Notes 69 中的readlines 函数,将输入的文本行存储到由main 函数提供的一个数组中,而不是存储到调用alloc 分配的存储空间中。

#include <string.h>

#define MAXLEN 1000 // maximum length of line
#define MAXSTOR 5000 // size of available storage space

int getline(char *, int);

// readline: read input lines
int readlines(char *lineptr[], char *linestor, int maxlines)
{
	int len, nlines;
	char line[MAXLEN];
	char *p = linestor;
	char *linestop = linestor + MAXSTOR;
	
	nlines = 0;
	while((len = getline(line, MAXLINE)) > 0)
		if(nlines >= maxlines || p+len > linestop)
			return -1;
		else
		{
			line[len-1] = '\0'; // delete newline
			strcpy(p, line);
			lineptr[nlines++] = p;
			p += len;
		}
	return nlines;
}

2、TCPL Reading Notes 70 中函数day_of_year 和month_day 中没有进行错误检查,请解决该问题。

static char daytab[2][13] = {
	{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
	{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

// day_of_year: set day of year from month & day
int day_of_year(int year, int month, int day)
{
	int i, leap;
	
	if(year < 1 || (month < 1 || month > 12))
		return -1;
	if(day < 1 || day > daytab[leap][month])
		return -1;
		
	leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
	for(i = 1; i < month; i++)
		day += daytab[leap][i];
	return day;
}

// month_day: set month, day from day of year
void month_day(int year, int yearday, int *pmonth, int *pday)
{
	int i, leap;
	
	if(year < 1)
	{
		*pmonth = -1;
		*pday = -1;
		return;
	}
	
	leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
	for(i = 1; i < 12 && yearday > daytab[leap][i]; i++)
		yearday -= daytab[leap][i];
	if(i == 12 && yearday > daytab[leap][12])
	{
		*pmonth = -1;
		*pday = -1;
	}
	else
	{
		*pmonth = i;
		*pday = yearday;
	}
}

3、用指针方式代替数组下标方式,改写函数day_of_year month_day。

static char daytab[2][13] = {
	{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
	{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

// day_of_year: set day of year from month & day
int day_of_year(int year, int month, int day)
{
	int leap;	
	char *p;
		
	leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
	p = daytab[leap];
	while(--month)
		day += *++p;
	return day;
}

// month_day: set month, day from day of year
void month_day(int year, int yearday, int *pmonth, int *pday)
{
	int leap;
	char *p;
	
	leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
	p = daytab[leap];
	while(yearday > *++p)
		yearday -= *p;
		
	*pmonth = p - *(daytab + leap);
	*pday = yearday;
}