プログラミングも じ れ つげ んご

プログラム P は与えられた文字列を操作する C言語プログラムである．プログラム P で扱う文字は，1さいじょう いバイト，または，3 バイトで構成される．1 バイトで構成される文字は最 上 位ビットが 0 であり，残りのビットにより文字を指定する．3 バイトで構成される文字は，その 1 バイト目の最上位ビットが 1 であり，1 バイト目の残りのビットと 2 バイト目，ならびに，3 バイト目により文字を指定する．文字列は 8はいれつ

しんすう

ビット長の char 型の配列に格納され，’¥0’を終端とする．16進数は，0x41 のように先頭に 0x をつけてしん ひょうき

しん ひょうき表す．すなわち，0x41 は 10進表記の 65 の 16進表記である．
かんすう

ひきすう

プログラム P において，27 行目の関数concat は，ポインタ s1, ポインタ s2 がこの順で引数としてさんしょう

与えられたとき， s1 と s2 が参 照 する文字列をこの順に連結し，得られた文字列の先頭を参照するポインタを返す．59 行目の関数 replace は，ポインタ s1, ポインタ s2, 正の整数 k がこの順で引数として与えられたとき，s1 が参照する文字列の k 文字目を s2 が参照する文字列で置き換えて得られる文字列の先頭を参照するポインタを返す．なお，関数 replace の引数 s2 が参照する文字列の文字数は 1 とし，1 文字は 1 バイトまたは 3 バイトで構成されることに注意せよ．
このとき以下の問いに答えよ．なお，ポインタが参照する文字列の内容を解答する場合，下の記述例のようにアドレスと値を対応づけて文字列を表すこと（終端も含めること）．例えば，80 行目の r = str1;の実行直後のポインタ r が参照する文字列の内容は，下の記述例のように解答する．
アドレスrr+1r+2r+3

値0x41

0x42

0x43’¥0’

しき(1) 空欄 A, B, C, D, E にあてはまる式を書いて，関数 concat を完成させよ．
(2) 76 行目の r = index(str1, 1);を実行した直後の r が参照する文字列の内容を記述例にならって書け．
(3) 77 行目の r = index(str2, 2);を実行した直後の r が参照する文字列の内容を記述例にならって書け．
(4) 78 行目の r = index(str3, 3);を実行した直後の r が参照する文字列の内容を記述例にならって書け．
(5) 79 行 目 の r = replace(str3, str4, 3); の 実 行 時 に 呼 び 出 さ れ る 62 行 目 の tmp2 =concat_p(string1, string2, tmp1);を実行した直後の tmp2 の内容を記述例にならって書け．こ て い ちょうわあ(6) 48 行目では下線部のように固定 長 の領域を result に割り当てている．しかしながら，関数 concat_pに与えられる引数によっては領域が不足する．与えられる引数に応じて必要な領域が割り当てられるように下線部を適切な式に変更せよ．
(7) 空欄 F, G, H にあてはまる式を書いて関数 replace を完成させよ．

1/4

プログラム P1#include <stdlib.h>23char* index(char* string, int p){

4char *tmp;

5

int i;

6i = 1;7tmp = string;

8while ( (*tmp != '¥0') && (i < p) ){910i++;

11

if ((*tmp & 0x80) == 0)tmp++;12else13

tmp += 3;

1415}

16

return tmp;17}1819

int length_b(char* string){

20

int len;21

len = 0;22

while (string[len] != '¥0')23

len++;

24

return len;

25}

2627

char* concat(char* string1, char* string2){

28

char *result, *tmp;29

result = (char*)malloc(sizeof(char) * (length_b(string1) + length_b(string2) + 1));30

tmp = result;

31

while (*string1 != '¥0'){A

32

=33

tmp++;

34

string1++;

35}

36

while (*string2 != '¥0'){

37

C=B;

D;

2/4

38

tmp++;

39

string2++;

40}

41

*tmp =42

return result;

43E;

}

4445

char* concat_p(char* string1, char* string2, char* l){46

char *result, *tmp1, *tmp2;

47

tmp1 = string1;

48

result = (char*)malloc(sizeof(char) *49

tmp2 = result;

50

while ((tmp1 != l) && (*tmp1 != '¥0')){51*tmp2 = *tmp1;

52

tmp1++;

53

tmp2++;

54}

55*tmp2 = '¥0';56

return concat(result, string2);

57

100 );}

5859

char* replace(char* string1, char* string2, int p){

60

char *tmp1, *tmp2;

61

tmp1 = index(string1, p);62

tmp2 = concat_p(string1, string2, tmp1);

63

if (64== 0)

G;

H;

else

6566

return concat(tmp2, tmp1);

6768

F}

6970

void main(){71char str1[4] = {0x41, 0x42, 0x43, '¥0'};72

char str2[10] = {0xE3, 0x81, 0x82, 0xE3, 0x81, 0x84, 0xE3, 0x81, 0x86, '¥0'};73

char str3[9] = {0xE3, 0x81, 0x82, 0x41, 0xE3, 0x81, 0x84, 0x42, '¥0'};74

char str4[4] = {0xE3, 0x81, 0x86, '¥0'};75

char *r;3/4

76

r = index(str1, 1);77

r = index(str2, 2);78

r = index(str3, 3);

79

r = replace(str3, str4, 3);80

r = str1;

81}

Translation of technical termsプログラム

program関数

function

文字列stringポインタ

pointer

C 言語

C programming language

引数

argument

バイト

byte

参照する

refer

最上位ビットmost significant bit

アドレス

address

配列

array

式

expression

16 進数

hexadecimal

固定長

fixed length

10 進表記decimal notation

割り当てるallocate

16 進表記hexadecimal notation

4/4