情報処理・演習II --

情報処理・演習II
--- 第6回: 文字や文字列の処理 --情報科学科
井口幸洋
[email protected]
2015/10/1
情報処理・演習II
1
文字列と文字列リテラル
• printf("This is a pen.");
文字列リテラル: プログラム
の中で文字列を表す表記の事
変数 r に"This is a pen."が格納
される先頭番地を代入
• char *r;
r
r = "This is a pen.";
'T' 'h' 'i' 's' ' ' 'i' 's' ' ' 'a' ' ' 'p' 'e' 'n' '.' 0
320
2015/10/1
324
328
情報処理・演習II
332
320
336
2
文字列を作る(1)
• 決まった文字列だけを扱う時
– 文字列リテラルを使えばよい
• 文字列を入力したり、プログラム内で文字列を作
成するとき
– 文字列を作る方法を学ぼう!
work
p
'a' 'b' 'c' 'd' 0
320
320
2015/10/1
324
328
情報処理・演習II
332
336
3
文字列を作る(2)
char work[5];
char *p;
work[0]='a'; work[1]='b'; work[2]='c';
work[3]='d'; work[4]= 0;
P = &work[0]; /* p = work と書いてもよい */
work
p
'a' 'b' 'c' 'd' 0
320
320
2015/10/1
324
328
情報処理・演習II
332
336
4
作った文字列を表示する
printf("%s\n",p);
printf("%s\n",work);
printf("%s\n",&work[0]);
work
p
'a' 'b' 'c' 'd' 0
320
320
2015/10/1
324
328
情報処理・演習II
332
336
5
キーボードからの文字列入力
char buffer[100];
int c, i;
i = 0;
for(;;){
c = getchar();
if (c == '\n')
break;
buffer[i] = c;
i++;
}
buffer[i] = 0;
i++;
2015/10/1
問題
なぜ char c; では駄目なのか?
問題
この行は何をしているのか?
問題
なぜ i++ をしているのか?
i は何を表しているか?
問題
扱える文字列の最大の長さは?
情報処理・演習II
6
キーボードからの文字列入力(side effect利用)
char buffer[100];
int c, i;
i = 0;
for(;;){
c = getchar();
if (c=='\n')
break;
buffer[i] = c;
i++;
}
buffer[i] = 0;
i++;
2015/10/1
char buffer[100];
int c, i;
i = 0;
for(;;){
c = getchar();
if (c=='\n')
break;
buffer[i++] = c;
}
buffer[i++] = 0;
情報処理・演習II
7
エラーチェック付キーボードからの文字列入力
char buffer[100];
int c, i;
i = 0;
for(;;){
c = getchar();
if (c=='\n')
break;
if(i >=99){
printf("Too long string was inputed.\n");
exit(1);
}
buffer[i++] = c;
}
buffer[i++] = 0;
2015/10/1
情報処理・演習II
8
文字列のメモリ管理
• 何行もある文章を扱うプログラム
– どのように文字列を格納すればよいか?
– 多次元配列を使う方法: メモリの無駄使い!
– 例えば1行最大10文字格納できるようにすると(文字
列の終了を示す0があるから11-byte用意)、下記のよ
うな例の場合1行目は 6-byte, 2・3行目は7-byte無
駄!
abcd
pqr
xyz
2015/10/1
情報処理・演習II
9
文字列のメモリ管理(解決法)
• 何行もある文章を扱うプログラム
– 一つの大きな配列に、詰め込む.
– 一つの行の区切りは0をいれる.
– 行の始まりを示す配列 line[]を用意.
line[i] には i 行目が格納される番地を入れる.
line[0] = 320; line[1] = 325; line[2] = 329;
'a' 'b' 'c' 'd' 0 'p' 'q' 'r' 0 'x' 'y' 'z' 0
320
2015/10/1
324
328
情報処理・演習II
332
336
10
文章を格納するプログラム(1)
char buffer[10000]; /* 10000文字格納 */
char *line[500]; /* 500行まで扱う */
int lc; /* line counter */
int cc; /* character counter */
int ch; /* 一文字入力用 */
lc = 0;
cc = 0;
2015/10/1
情報処理・演習II
11
文章を格納するプログラム(2)
for(;;){ /* 行の繰り返し */
ch = getchar();
if (ch == EOF) break; /* End Of File検出 */
if (lc >= 500) {
printf("Too many lines.\n");
exit(1);
}
line[lc] = &buffer[cc]; /* lc行目の先頭番地 */
lc++;
2015/10/1
情報処理・演習II
12
文章を格納するプログラム(3)
for(;;){ /* 文字の繰り返し */
if (ch == '\n') break; /* 改行検出 */
if (cc >= 9999) {
printf("Too many characters.\n");
exit(2);
}
buffer[cc++] = ch;
ch = getchar();
}
buffer[cc++] = 0;
}
2015/10/1
情報処理・演習II
13