第7回 文字変換,各種入出力関数,文字型配列

このドキュメントは http://icrus.org/c_language_beginers_course/ 上にあります.

[課題7-1]

キーボードから1文字入力し,画面にその文字を出力させましょう.

[プログラム例7-1]


01: #include <stdio.h>
02:
03: void main(void){
04:     int  ch;
05:
06:     printf( "何か1文字を入力してリターンキーを押して下さい.\n?");
07:     ch = getchar();
08:     printf( "ただいま");
09:     putchar( ch );
10:     printf( "が入力されました.\n");
11:     getchar();
12:     getchar();
13: }

行説明
07行目→関数getchar()を使ってキーボードから入力された1文字を変数chに文字コードとして代入します.
09行目→関数putchar(ch)を使って変数chに格納された文字コードから画面に文字を出力します.
11行目→リターンキー押して文字を入力しますので,そのときの復改コートを読みとります.
12行目→もう一度リターンキーを押すとプログラムは終了します.

[結果7-1]

 コンパイル・実行すると次のよう表示されます.

何か1文字を入力してリターンキーを押して下さい.
C[リターン印]
ただいまCが入力されました.

リターンキーを押すとプログラムは終了します.

 関数getchar(),putchar(ch)を使って1文字の入出力ができるようになりましたがこのプログラムでは実用性がありませんね.関数の紹介だと思って下さい.さらにwhile文なとを使っていくと,多数の文字(文字列)を扱えるようになります.
 関数getchar()は,戻り値としてint(整数型)で返してきます.戻り値とはch=getchar();としたときchに代入される値のことです.変数chの型はchar(文字型)ではなくint(整数型)を使って下さい.そうしないと,関数getchar()が返すEOF(ファイルの最後にと到達したことを示す,値はintの-1)が使えなくなります.
 キーボードから入力された文字は,アスキーコード表と呼ばれる対応表によって1バイト(=8ビット→8つの0と1の組み合わせ)数値に変換されます.プログラムではそれを関数getchar()の戻り値として得ます.しかし関数getchar()の戻り値はint型で2バイト(16ビット)です.ですから,関数getchar()の戻り値の構成は,上位8ビットを0として,下位8ビットにアスキーコード代入した2バイトの構成になります.

********説明絵図*****************

今まで#include <stdio.h>行を呪文のように使ってきましたが,ここで説明します.putchar(),printf()などの標準入出力関数を使用するときは必ずこの行を付ける必要があります.意味としては,stdio.h というファイル(ヘッターファイルといいC言語で書かれている)をその行のところに挿入する.ということです.このファイルには,標準入出力関数の機能がマクロ宣言されたり,引数や戻り値の型が宣言されています.(実際にどのようなものか見たい場合はエディタを使って,コンパリラディレクトリーの下のディレクトリー名includeの下を見て下さい拡張子にhのついたファイルがたくさんあります.その中にstdio.hやmath.hがあるはずです.コンパイラー添付のヘッターファイルは絶対に変更しないで,見るだけにして下さい.)

[課題7-2]

キーボードから文字列を入力し,合い言葉が正しいかどうか判断させましょう.

[プログラム例7-2]


01: #include <stdio.h>
02: #include <string.h>
03: void main(void){
04      char str[80], name[80];
05:     char words[20]="ひらけごま";
06:
07:     printf( "あなたの名前を教えて下さい:");
08:     gets( name );
09:     printf( "%sさん あいことばをどうぞ:",name );
10:     gets( str );
11:     if( strcmp( str, words ) )
12:         printf( "あなたは%sさんではない.入ってくるな!\n",name );
13:     else
14:         printf( "こんにちは,%sさん.どうぞお入り下さい.\n",name );
15:     getchar();
16: }

行説明
  02行目→関数strcmp()など文字列関係の関数を使うときに必要なヘッターファイルです.
04行目→80文字まで格納できる文字列strを宣言します.
05行目→80文字まで格納できる文字列nameを宣言し,文字列"ひらけごま"をコピーします.
07行目→関数gets(name)を使って,キーボードから文字列nameに名前を入力します.
08行目→関数printf()の%sは,文字列nameの出力を関数printf()に知らせます.
09行目→7行目と同様に,キーボードから文字列wordsにあいことばを入力します.
11~13行目→関数strcmp()を使い,もし文字列str,wordsが等しければ13行目を,等しくなければ11行目を実行します.

[結果7-2]

 コンパイル・実行すると次のよう表示されます.

例1

あなたの名前を教えて下さい:さとう[リターン印]
さとうさん あいことばをどうぞ:ひらけごま[リターン印]
こんにちは,さとうさん.どうぞお入り下さい.

例2

あなたの名前を教えて下さい:satoh[リターン印]
satohさん あいことばをどうぞ:ひらけ[リターン印]
あなたはsatohさんではない.入ってくるな!

 関数gets(name)は,キーボードからリターンキーを押すまでの1行を文字列nameにコピーする関数です.
 関数puts(name)は,画面へ文字列nameの1行を画面にコピーします.
 また,関数strcmp(name,words)は2つの文字列を比較して,等しいときは0を戻り値として返し,文字コードを辞書順に比較して,name>wordsのときは正のあたいを,name<wordsのときは負の値を返します.

今まで,関数printf()は,フォーマット(""で囲まれた第一引数)については,ほとんど説明なしに使ってきましたがここで少し詳しく説明します.フォーマットは大きく3つに分類できます.①%で始まるもの→変換文字列②\で始まるもの→エスケープ文字③それ以外の文字→そのまま画面などに出力させたい文字 です.①と②でよく使われるもの次にまとめました.

変換文字列

文字列変換フォーマット
%d → int型変数を10進数として出力する.
%o → int型変数を8進数として出力する.
%x → int型変数を16進数として出力する.
%c → 1文字出力する.
%s → 文字列として出力する.
%lf → double型変数を浮動小数点表示する.
%ld → long型変数を10進数として表示する.
%*c → 1文字読み飛ばす.

関数printf()の変換文字列

エスケープ文字列 機能
\n → 復改
\t → タブコード
\0 → アスキーコード0(文字列の終了を表す)
\a → ブザーを鳴らす
\xhh → hhの16進数(1バイトなので\x00~\xffで表す)
\\ → \(円マーク)を表示する
\" → "(ダブルコーテーションマーク)を表示する

エスケープ文字列
①変換文字列は,第2引数以降の変数をどのように文字に変換して出力するかを関数printf()に知らせます.
②エスケープ文字列は文字だけでは表せない機能を文字列として表現します.
③それ以外の文字はそのまま画面などに出力されます.

[文法7]

1.関数printf()


①printf( "文字列" );
①printf( 書式文字列, 変数, ・・・ );
書式文字列中の変換文字列の数だけ変数が続きます.

(1)文字列を引数とすると文字列のみ出力できます.
例 printf( "hello, world." ); →出力 hello, world
(2)通常の文字列といくつかの変換文字列を組み合わせて出力できます.
例 printf( "答えはa=%d, b=%d, c=%lfです.", a, b, c );
→出力 答えはa=2, b=3, c=2.43です.

2.関数getchar()

c=getchar();
cは,int型の変数
(1)戻り値はキーボードからの1文字入力です.
(2)リターンキーが押されるまで処理を待ちます.(リターンキーも復改として1文字です.)

3.関数putchar()


①putchar( c );
②putchar( '1文字' );
cは,引数でint型またはchar型の変数
(1)①変数を文字としてディスプレイに出力します.
(2)②直接''(シングルコーテーション)で囲んだ1文字を出力できます.
例 putchar( 'a' );

4.関数gets()

gets( str );
strは,文字列変数(=char型配列の配列名)
(1)キーボードから,リターンキーが押されるまで入力された文字をchar型配列にコピーします.
(2)コピーされるchar型配列は十分な長さを宣言しておいて下さい.

5.関数puts()

puts( str );
strは,文字列変数(=char型配列の配列名)
(1)文字列をディスプレイにコピーします.さらに自動的に復改します.

6.関数strcmp()


① i = strcmp( str1, str2 );
i は int 型変数
str1, str2は文字配列名(char型配列名)
(1)2つの文字列str1,str2を比較します.その結果を戻り値として返します.
(2)str1,str2は文字配列名,または""で囲んだ文字列("文字列")でも構いません.
(3)戻り値は次の通りです.比較は各文字列の最初の文字から始め,異なる文字が見つかるまで,あるいは文字列の終わりに達するまで続けます.数値の比較はアスキーコードによります.
str1 > str2 のとき 正の値
str1 == str2 のとき 0
str1 < str2 のとき 負の値

7.char型の宣言


① char 配列名[整数値];
② char 配列名[整数値]="文字列";
③ char 配列名[]="文字列";
④ char 変数名;
(1)char型の配列を宣言することにより文字列を格納する場所を確保します.
(2)②,③のように宣言と同時に初期化することができます.
(3)④のように1文字を宣言するができます.しかし,関数getchar()の戻り値にあるEOF(実際はint型の-1)は受け取れません.このようなときはint型の変数を使用して下さい.

このドキュメントは http://icrus.org/c_language_beginers_course/ 上にあります.

2017,1 ssatoh@

足立工科大学 工学部 情報通信工学科