これまで,データ型には 整数型(int)と実数型(double) を学んだが,その他に文字型(char)というものがある. 文字型の変数は英数文字1文字に対応する. (日本語については言及しない)
なお,%c は 一文字の文字型を表示する"変換指示子"である.
さて,文字型は文字通り文字を表す型であるが,
その中身は整数である.
ただし,通常の整数intに比べて狭い範囲の整数しか
表すことができない.
通常,文字型は0-255の256個の整数値で表わされる
(通常、その半分の0-127の128個の整数値を用いている下図参照).
その整数値が文字に対応している
これをアスキーコードと呼ぶ.
上位4ビット | 0 1 2 3 4 5 6 7 --------------------------------------------------- 0(0) | NUL DLE SP 0 @ P ` p 1(1) | SOH DC1 ! 1 A Q a q 2(2) | STX DC2 " 2 B R b r 下 3(3) | ETX DC3 # 3 C S c s 位 4(4) | EOT DC4 $ 4 D T d t 4 5(5) | ENQ NAC % 5 E U e u ビ 6(6) | ACK SYN & 6 F V f v ッ 7(7) | BEL ETB ' 7 G W g w ト 8(8) | BS CAN ( 8 H X h x 9(9) | HT EM ) 9 I Y i y 10(A) | LF/NL SUB * : J Z j z 11(B) | VT ESC + ; K [ k { 12(C) | FF FS , < L \ l | 13(D) | CR GS - = M ] m } 14(E) | S0 RS . > N ^ n ~ 15(F) | S1 US / ? O _ o DEL
コンピュータは2進数で数値を表している. たとえば,10進数の5は2進数では101である.
位 23=8 22=4 21=2 20=1 0 1 0 1 ------------------------------------------------ 0*8 + 1*4 + 0*2 + 1*1=5
そのままでは,桁数が大きくなりすぎるので 数値を表すときは16進数で表すことが多い (4桁(4ビット)ずつに分けて考える).
10進数 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16進数 0 1 2 3 4 5 6 7 8 9 A B C D E F
テキストでは16進数で表すとき数値の後にh
(hexadecumal 16進数)を付けている.
C言語では,数値の前に”0x”を付ける
0x23 == 35 (23h)
一文字を入力するためには,getchar()をもちいる.
ただし,getcharは 文字型ではなく,整数型を返す.
これは,アスキーコードに,入力の終了を表すEOF(End of File)
(-1です)を返すことができるように拡張しているためである.
/* * 読み込んだ内容を文字ごとに表示 */ #include <stdio.h> int main(void) { int c; /* charではいけない! */ printf("文字列を入力して最後にReturnキーを押して下さい.\n"); printf("(終了はControl-d)\n"); /* キーボード入力はReturnを押した時に1度にまとめて渡される */ while ( (c = getchar()) != EOF ) { printf("'%c' -> %3d (%xh)\n", (char)c, c, c); } return 0 ; } |
前回,配列を学んだが,文字列は配列として取り扱われる. 文字を表すデータ型は文字型であるため,文字列は
char moji[12];
というように宣言される.文字列に初期値を代入するときは”"”で囲む.
char str[8]="Moji";
ただし,文字列には必ず最後に'\0'で終端されるので, 配列の要素数は文字数+1以上用意しなければならない. (ポイント1)
#include <stdio.h> int main(void) { int i; char moji1[]="Moji1"; char moji2[6]; moji2[0]='M'; moji2[1]='o'; moji2[2]='j'; moji2[3]='i'; moji2[4]='2'; moji2[5]='\0'; printf("Srting1=%s\n",moji1); printf("String2=%s\n",moji2); for(i=0;i<6;i++){ printf("String[%d]=%c -> %d, (%xh)\n",i,moji1[i], (int)moji1[i],(int)moji1[i]); } return 0; } |
printf の書式指定文字列中の”%s”は対応する文字列を表示する.
また,”%c”は1文字を,”%x”は16進数の整数を表示する.
C言語には,あらかじめ文字列を扱う関数が用意されている.
文字列を扱うためには string.h をインクルードする必要がある.
文字列を扱う関数の例
gets( 文字配列 )
getsは文字配列をキーボードから読みとってくれる.
sprintf(文字配列, "書式指定文字列", 引数1,引数2,....);
sprintfは,文字列に指定した書式を代入する関数である.
getsを用いてコンパイルすると,
”the `gets' function is dangerous and should not be used.”
とコンパイラから注意されます.
gets は文字配列を受け取るが,
文字配列の大きさが指定されていないため,
もしかすると,実際の文字列の要素数より多い文字を
受け取ってしまう可能性がある.
このような時には,fgetsを用いる. fgetsは(文字配列,受け取る文字数,ファイルポインタ) という形で用いる.
なお,文字配列の要素数は,最後の'\0' を含めるため,
受け取る文字数+1以上でなければならない.
fgetsは本来ファイルからデータを読み出す時に使うため,
ファイルポインタを使用しなければならないが,
stdin としておくと”標準入力(いまの場合はキーボードから)”
から入力される.
なお,fgetsはgetsと違って改行コード "\n"まで
入力されることに注意すること.
同様に,文字数を制限した 文字列のコピーに strncpyがある.
課題9[文字列(その2)] 提出期限 1/6 最終1/13