以下習題摘自 C Primer Plus
月份名
1.程序。用戶提供月份名的拼寫,返回一年中到該月為止(包括該月)的總天數。(strcmp()),結構模板,一個月份名,該月份名的三個字母縮寫,該月份的天數及月份號。
分析發現,需要月份結構的數組,然后向函數傳入數組。然后如何在函數形參列表聲明這個數組形參?
初次代碼如下
#include <stdio.h>
#define SIZE 10
int read_days(char * mon_name,struct month * ptr);
struct month{
char name[SIZE];
char suo[SIZE];
int num;
int index;
};
int main (void)
{
char input[SIZE];
int sum;
struct month arr[4]={
{"Jannuary","Jan",31,1},
{"February","Feb",28,2},
{"March","Mar",31,3},
{"April","Apr",30,4}
};
scanf("%s",input);
sum=read_days(input,arr);
printf("%d",sum);
}
int read_days(char * mon_name,struct month * ptr)
{
int i=0;
for
}
于是翻了答案..
截取了函數那段的代碼
#include <stdio.h>
#include <string.h>
//字符處理頭文件
#include <ctype.h>
int days(char * m)
{
int total = 0;
int mon_num = 0;
int i;
/* int toupper(int c);如果c是小寫字符,則返回其大寫字符,
否則返回c*/
m[0] = toupper(m[0]);
for (i = 1; m[i] != '\0'; i++)
//和toupper相反,返回小寫
m[i] = tolower(m[i]);
for (i = 0; i < 12; i++)
if (strcmp(m, months[i].name) == 0)
{
mon_num = months[i].monumb;
break;
}
if (mon_num == 0)
total = -1;
else
for (i = 0; i < mon_num; i++)
total +=months[i].days;
return total;
剛開始看得挺懵逼的,后來在xcode里跑了一下,又用debug看了一下,搞懂了他想干嘛。
其實它考慮了各種情況。
1.用戶輸入了正確的月份名但大小寫不同會造成strcmp比較ASCII碼時出錯,于是便統一把所有的第一個字母toupper,其他字母tolower(形參列表可以傳入字符).
2.用戶亂輸字符串。因為main函數里測試條件只要求輸入的是字符串以及不是q退出,于是在days()里,如果沒有匹配的,便為無效輸入,最后才是累加。
3.關于之前考慮的傳入結構數組的問題,其實不必。把結構體和結構數組都寫在外面,那么就可以被任意調用了。
4.順便積累些變量名。縮寫-abbrev,一月的天數---monumb/mon_num,總天數---daytotal,此處days函數,然后形參就亂取了個m。
5.還有個地方易錯,就是字符串老是忘打雙引號,像這樣..
屏幕快照 2017-11-29 下午1.14.50.png