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;
}
浙公网安备 33010602011771号