問7 次の C プログラムの説明及びプログラムを読んで,設問に答えよ。
〔プログラムの説明〕
関数 addrsync は,二つのアドレス帳の内容を同一にする(同期をとる)関数である。
typedef struct { char flag; /* フラグ */ char *name; /* 氏名へのポインタ */ int nlen; /* 氏名の長さ */ char *addr; /* メールアドレスへのポインタ */ int alen; /* メールアドレスの長さ */ char *time; /* 更新日時へのポインタ */ } ADDR;
フラグは現在のレコードの状態を示し,内容は次のとおりである。
“E”: ADDR 配列の終端を示す。氏名,メールアドレスともに意味をもたず, 氏名の長さ,メールアドレスの長さには −1 が格納される。 更新日時の形式は“YYYY-MM-DD hh:mm:ss”(西暦年-月-日 時:分:秒)である。
表1 氏名が片方にだけ存在する場合の処理内容
“U”
“A”
“D”
表2 氏名が両方に存在する場合の処理内容
フラグの内容の組合せ
処理内容(同期した ADDR 配列への格納)
“ ”と“ ”
“ ”と“U”
“ ”と“A”
“ ”と“D”
“U”と“U”
“U”と“A”
“U”と“D”
“A”と“A”
“A”と“D”
“D”と“D”
〔プログラム〕
#include <string.h> #include <stdio.h> typedef struct { char flag; /* フラグ */ char *name; /* 氏名へのポインタ */ int nlen; /* 氏名の長さ */ char *addr; /* メールアドレスへのポインタ */ int alen; /* メールアドレスの長さ */ char *time; /* 更新日時へのポインタ */ } ADDR; int namecmp(char *, int, char *, int); void addrsync(ADDR desk[], ADDR note[], ADDR sync[]) { int didx=0, nidx=0, sidx=0, comp; while ( ) { comp = namecmp(desk[didx].name, desk[didx].nlen, note[nidx].name, note[nidx].nlen); if (comp < 0) { if (desk[didx].flag != 'D') { sync[sidx] = desk[didx]; sync[sidx++].flag = ' '; } ; } else if (comp > 0) { if (note[nidx].flag != 'D') { sync[sidx] = note[nidx]; sync[sidx++].flag = ' '; } ; } else { if (strncmp(desk[didx].time, note[nidx].time, 19) > 0) { if (desk[didx].flag != 'D') { sync[sidx] = desk[didx]; sync[sidx++].flag = ' '; } } else { if (note[nidx].flag != 'D') { sync[sidx] = note[nidx]; sync[sidx++].flag = ' '; } } ; } } sync[sidx].flag = 'E'; sync[sidx].nlen = -1; sync[sidx].alen = -1; } int namecmp(char *str1, int len1, char *str2, int len2) { int leng, result; if (len1 == -1) return 1; if (len2 == -1) return -1; leng = (len1 < len2) ? len1 : len2; result = strncmp(str1, str2, leng); if (result == 0) ; return result; }
a に関する解答群
ア desk[didx].flag == 'E'
イ desk[didx].flag == 'E' && note[nidx].flag == 'E'
ウ desk[didx].flag == 'E' || note[nidx].flag == 'E'
エ desk[didx].flag != 'E'
オ desk[didx].flag != 'E' && note[nidx].flag != 'E'
カ desk[didx].flag != 'E' || note[nidx].flag != 'E'
b 〜 d に関する解答群
ア didx++ イ nidx++ ウ sidx++
エ didx++, nidx++ オ didx++, sidx++ カ nidx++, sidx++
キ didx++, nidx++, sidx++
e に関する解答群
ア result = 1
イ result = -1
ウ result = len1 - len2
エ result = len2 - len1
オ result = (len1 < len2) ? len1 : len2
カ result = (len1 < len2) ? len2 : len1