296 ・ 付録 strcmp 機能文字列と文字列を比較する . ヘッダファイル <string. h> 書式ゴ月亡 strcmp(c 〇月Sし char *sl, c 〇月 s し char * s2 房 戻り値 意昧 <SI> はく s2 > より小 く sl > とく s2 > 等しい く s1 > はく s2 > より大 strcpy 機能文字列を他の文字列にコピーする . ヘッダファイルく string ・ h> 書式 char *strcpy( char *dest, C 〇月 S と Char *src) ー 戻り値く dest> を指すポインタを返す . strlen 機能 文字列の長さを計算する . ヘッダファイル <string . h> 書式 size_t strlen(c 〇月S亡 char (s) ー 説明 たとえは str1en('ABC' ) は 3 である . 戻り値 文字列の大きさをハイト数で返す .
7.72 ホインタ この関数が返す文字列 ( の先頭アドレス ) を受け取るには , 次の ノ 09 たとえば , ようにします . char s [ 2 5 6 ]; fu c ( 引数の並び ) : 長さを調べます . この関数を使う場合は , 次の 1 行が必要です . 次のプログラムは , 文字列の引数を使う例です . strlen は引数の文字列の #include <string . h> サンプレプログラム 50 #include く s し d 土 0 . h > #include <string . h> / * 最後の文字を取除く * / void dec—str(char *s) 土 n し 1ast s し r 1 en ( s ) : / * strlen * / 土 f ( last > O ) s[last main() char name [ ] 土 n に土冫 "Computer" 0; 土く 8 : for ( 土 printf("%sYn" dec_str (name) ー return 0; name ) :
5 イ この プ C& C + + ス円 7.5.3 文字配列への代スノ StrCPY しかし文字配列へ文字を代入するのに , 1 文字ずっ代入するのは大変めん どうです . また , " 我が輩は猫である " のような全角文字を 1 文字ずつ代入することは できません . これは■我ーのような全角文字を char 型として扱うことができ ないからです . かといって全角文字を char 型の配列に代入できないわけでは ありません . つまり , 全角文字の場合 , 2 つ分の char 型配列を使います . そのため全角 文字のままで 1 文字ずつ配列に代入することはできません . その代わり , 全角 文字の代人には strcpy という文字列をコピーする関数を使います . strcpy(s, この文字列を " 我が輩は猫である " ) この文字列配列にコピー もちろん strcpy を使って半角文字列をコピーすることもできます . strcpy を使うには , 次の 1 行が必要です . #include <string. h> サンプルプログラム 24 #include <stdio . h> #include <string. h> main ( ) char s [ 2 0 / * printf を使うために必要 * / / * strcpy を使うために必要 * / strcpy(), " 我が輩は猫である printf("%sYn", s); return 0 ー
29 イ getch 機能キーホードからエコーノヾックなしで 1 文字入力する . ヘッダファイル <conio. h> 書式月 getch(void); 戻り値入力した文字 . getchar 機能標準入力 (stdin) から 1 文字入力する . ヘッダファイル <stdio. h> 書式月亡 getchar(v 〇 (d) : 戻り値成功 = 入力した文字を符号拡張せすに土 n しで返す . gets 工ラーまたはファイルの終わりに達していれは EOF. 機能 ヘッダファイル 書式 戻り値 標準入力 (stdin) から文字列を入力する . く s に d 土 0 . h> char *gets (char *string) : <string> へのホインタを返す . 工ラーまたはファイルの終わりに達しているときは , NULL を返す . kbhit 機能 ヘッダファイル 書式 説明 戻り値 キーホードが押されたかとうかをチェックする . く con 土 0 . h> 月亡 kbhit(v 〇 (d) : 0 入力テータがない 入力テータがある = 0 以外 入力テータがある場合 , getch または getche で入力できる . malloc 機能 ヘッダファイル 書式 戻り値 ヒープメモリを確保する . く a110C . h> く s に dl 土 b . h > ・熱 s ェ c との互換のため v 〇 id * ma110c ( s ze ーと s ze 房 成功 = 割り当てたメモリへの void ポインタを返す . 失敗 = NULL printf 機能 ヘッダファイル 書式 説明 戻り値 書式付き文字列を標準出力へ出力する . く s セ d 土 0 . h> 月亡 printf ( c 〇 nst char *f 〇 rmat ー / argument, 書式付き文字列に含める書式指定は , 次の形式を取る . 宅 [flags] [width] [ . prec] [prefix] に ) rpe 成功 = 出力した文字数 失敗 = EOF
ノ 32 2 プログラミングの定石 サンプレプログラム 57 #include く s し d 土 0 . h> #inCIUde く con 土 0 . h> #include <string. h> こに 2.4 節の get_charset を置く char get—menu ( char *promptl , char *prompt2 , char *charset ) printf ( pror 叩し 1 房 return get_charset (prompt2 ー charset ) : Char *mnu " メインメニュー Yn" ー Y n" " 1 ] アクションゲーム Y n" " 2 ] ロールプレイングゲーム Y n" " 3 ] シミュレーションゲーム Yn" "0] 終了 YnYn" ・ main ( ) char select; select = get—menu(mnu, " どれで遊びますか ? " printf("%c が選択されました¥ n " , select); return 0 : " 123 0 " ) :
24 スカ文字を制限るには ? メニューなどの選択で , 指定した文字以外の文字を入力させたくないとき があります . この指定以外の文字の入力を防ぐために , 不正な文字が入力さ れた場合はベルを鵈らし , 再度人力をやり直させる関数 get_charset を作り ます . get-charset は , 第 1 引数に画面に表示させたいプロンプト , 第 2 引数に入 力してよい文字集合を指定します . たとえば次のサンプルプログラムでは , Y と N 以外の文字を入力できないようにしています . #include く s し d 土 0 . h> サンプルプログラム 56 ノ 29 #include #include char char get—charset ( char *prompt ′ <string. h> く con 土 0 . h> C : putchar ( ' Y a ' ) : for C : putchar い Yn' 房 if (strchr (charset, putchar ( ・ Yn' 房 c = getche ( 房 printf (prompt) : ・・ getche を使うため ・・ st 「 chr を使うため char *charset )
60 7 C& C + + ス門 1.6.2 文字列から数への変換 a わ a わ′ 関数 gets は , 文字列変数にしか入力できません . つまり , int 型などの変 数に入力させることはできません . 土 n し土冫 pr 土 n し f ( 。あなたの身長は ? " ) : gets は房 これはタメ ! たとえキーボードから数字を入力しても , プログラムの中では文字列として 扱われます . キーポードから int 型の変数や float 型の変数にデータを人力したい場合は , 入力した文字列をこれらの型に変換してやります . 変換するには , 次の関数 を使います . atO i atof ・・文字列を int に変換する ・文字列を float に変換する 変換の仕方は , 次のように代人式を使います . data int 型変数 a に 0 土 (string) : 文字配列 整数を表す文字列か代入されていること ! これらの関数を使用する場合は , 次の 1 行が必要です . #include <stdlib. h>
3 イ 7 C & C + + ス円 サンプルプログラム 14 #include く s し d 土 0 . h > main( ) printf("%1dYn" 12 3 4 5 6 7 8 9 房 return 0 ー 実行例 12 3 4 5 6 7 8 9 こんとは OK ー 32768 ~ 32767 までの整数を int 型整数といい , 変換指示子には %d を 使います . また , これを超える大きな整数を ngint 型整数といい , 変換指 示子には % 旧を使います . 1.3.2 データ型に合わせて変換指示子を変える 文字列や int や longint のように , c ではさまざまな種類のデータが使われ ます . データの種類のことをデータ型といいます . 本書では , 次のデータ型を使用します . 意味 例 整数 大きな整数 実数 1 文字 文字列 データ型 1000 45678 3.141 "string" i nt long int float Char 文字列 演習問題 この他にどのようなテータ型があるか調べなさい .
3 / カラフルな画面 cprintf ( "string'j) ー textattr (UNDERL 工 (E) : UNDERLINE を指定し , cprintf で文字を出力します . たとえばアンダーライン付きで表示したければ , 次のように textattr で return 0; cprintf("yellow & allYrYn"); VERT 工 CALL 工 (E) : textattr (YELLOW ー BL 工 NK ー REVERSE ー UNDERL 工 NE ー cprintf("cyan & verticallineyryn"); textattr (CYAN ー VERT 工 CALL 工 (E) : cprintf ( "green & under1ineYrYn" ) : textattr (GREEN ー UNDERL 工 (E) ー cprintf( "red & reverseYrYn") : textattr(RED ー REVERSE) : cprintf("blue & blinkYrYn") ー textattr (BLUE ー BL 工 (K) ー main() く con 土 0 . h > サンフルプログラム 63 を参照してください . することが可能です ( ただし , 色は 1 色のみです ) . 次のサンプルプログラム また , 上記属性や前節の色の指定は , : 演算子を使って複数個同時に指定 7 イ 9
プログラムリスト 22.5 data. c データ管理 data . c 1994 . 1 . 7 : by K. T #include ” data . h" #include <string. h> 4.22 / * strstr * / 25 / 土 n し char struct flg—change next_input nex し brows e CLlrr item ・ Person data [N_DATA] : / * データが変更されれば 1 * / / * 次の入力位置 * / / * 現在の表示位置 * / / * 検索・ソート用カレント項目 / * レコード格納 * / / * データがあるか調べる / * 戻り値 : 1 = データなし . 0 ーデータあり * / 土 n し is_empty (void) return (next_input / * データを入力可能か調べる / * 戻り値 : 1 = 入力可能 , 0 = 入力不能 * / 土 n し is_input (void) / * データが変更されているか調べる * / return (next—input < N_DATA) ー flg—change VOid reset_change (void) / * データ変更フラグクリア flg_change void set_change (void) / * データ変更フラグセット return flg—change : 土 n し is change (void)