基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成18年 秋期 基本情報技術者 午後 問10
問10   C言語

 次の C プログラムの説明及びプログラムを読んで,設問1,2に答えよ。

〔プログラムの説明〕

 関数 pattern_match_string は,対象文字列を先頭から1文字ずつ順に調べ, パターン文字列が表現している条件を満足しているかどうかを判定するプログラムである。

(1) 条件文字列は,対象文字列の各文字(対象文字)に対する条件を表現した1文字以上の文字列 (パターン文字列)を連結したものである。 対象文字とパターン文字列の対応関係は,図のとおりである。

  図 対象文字とパターン文字列の対応関係

(2) 関数 pattern_match_string の引数は,次のとおりである。

target:対象文字列

cond:条件文字列

(3) 対象文字は,英数字だけである。

(4) パターン文字列に含まれる文字は,次のとおりである。

@ 英数字

A “ $ ”,“ [ ”,“ ] ”,“ { ”,“ } ”,“ @ ”

(5) 対象文字列及び条件文字列に誤りはない。

(6) 表の例では,対象文字列はいずれの条件文字列で表現される条件も満足している。

表 対象文字列と条件文字列の例
対象文字列FE2006
条件文字列FE2@06
F$U2006

〔プログラム〕

#include <string.h>
int pattern_match_string(char *, char *);
static char numeral[] = "0123456789";               /* 数字 */
static char lower[] = "abcdefghijklmnopqrstuvwxyz"; /* 英小文字 */
static char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /* 英大文字 */
int pattern_match_string(char *target, char *cond){
   int flg = 0, i;
   while(*target != '\0' && *cond != '\0' && flg == 0){
         if(*cond == '$'){               /* 先頭が'$'の場合 */
            cond++;
            if(*cond == 'N'){
               for(i = 0; numeral[i] != *target
                       && numeral[i] != '\0'; i++);
               if(numeral[i] != *target) flg = 1;
            }else if(*cond == 'L'){
               for(i = 0; lower[i] != *target
                       && lower[i] != '\0'; i++);
               if(lower[i] != *target) flg = 1;
            }else if(*cond == 'U'){
               for(i = 0; upper[i] != *target
                       && upper[i] != '\0'; i++);
               if(upper[i] != *target) flg = 1;
            }else if(*cond != *target){
               flg = 1;
            }
         }else if(*cond == '['){         /* 先頭が'['の場合 */
            flg = 1;
            for(cond++; *cond != ']'; cond++)
                if(*target == *cond) flg = 0;
         }else if(*cond == '{'){         /* 先頭が'{'の場合 */
            for(cond++; *cond != '}'; cond++)
                if(*target == *cond) flg = 1;
         }else if(*cond != '@'){         /* 先頭が'@'でない場合 */
            if(*target != *cond) flg = 1;
         }
         if(flg == 0){
            target++;
            cond++;
         }
   }
   if(flg != 0){
      return strlen(target);
   }else if(*target == *cond){
      return 0;
   }else{
      return -1;
   }
}

設問1 パターン文字列に関する次の説明中の に入れる正しい答えを,解答群の中から選べ。

(1) 対象文字が任意の英数字であることを表現するパターン文字列は, である。

(2) 対象文字が数字であることを表現するパターン文字列は, である。

(3) 対象文字が“ X ”,“ Y ”,“ Z ”のいずれかの文字であることを表現するパターン文字列は, である。

(4) 対象文字が“ X ”,“ Y ”,“ Z ”のいずれの文字でもないことを表現するパターン文字列は, である。

a,b に関する解答群

ア “ @ ”     イ “ $A ”    ウ “ $L ”    エ “ $LU ”

オ “ $N ”    カ “ $U ”    キ “ $@ ”

c,d に関する解答群

ア “ [XYZ] ”     イ “ {XYZ} ”    ウ “ $XYZ$ ”

エ “ $[XYZ$] ”    オ “ ${XYZ$} ”

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

解答 c ←クリックすると正解が表示されます

解答 d ←クリックすると正解が表示されます

基本情報技術者試験


設問2 関数pattern_match_stringの返却値に関する次の説明中の に入れる正しい答えを,解答群の中から選べ。

(1) 対象文字列のすべての文字が条件文字列で与えた条件を満足している場合, 返却値として を返す。

(2) 対象文字列の途中の文字に条件文字列で与えた条件を満足しないものがあった場合, そこで判定を終了し,返却値として を返す。

(3) 対象文字列と条件文字列のいずれかが途中で終了してしまった場合('\0'が見つかった場合), そこで判定を終了し,返却値として −1を返す。

解答群

ア  0

イ −1

ウ 対象文字列の文字数

エ 検査した対象文字数

オ 検査して条件を満足していた対象文字数

カ 検査していない対象文字数 + 1

キ 検査していない対象文字数

解答 e ←クリックすると正解が表示されます

解答 f ←クリックすると正解が表示されます


[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]