情報処理・演習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
© Copyright 2024 ExpyDoc