スポンサーリンク

文字型変数宣言charと配列・表現範囲とEOFと関数に渡す方法の説明

文字型変数宣言charと配列

前回までは数字の入力出力を勉強しました。今度は文字の入力を勉強してみたいと思います。
ちなみに文字型変数宣言は 【 char 】 を使うのですが、まずは整数型変数宣言【 int 】を使用した1文字入出力から始めたいと思います。
サンプルソース

#include <stdio.h>
main()
{
int a;
a=getchar();
putchar(a);
}

解説

整数型変数宣言 【 int 】 を使いますが、数字の場合は 【 scanf 】 と %d を使いましたが、文字の場合は【 getchar 】を使い、変数【 a 】に文字を代入させます。出力の際通常【 printf 】関数を使いますが【 getchar 】関数を仕様した場合は必ず【 putchar 】を使うと言う決まりがあります。

サンプルプログラムの実行結果です。

charと配列

今度は複数の文字を入力できるようにするため文字型変数宣言【 char 】と配列も併せて勉強してみたいと思います。

【 int 】や【 float 】をそれぞれ勉強しましたが、変数は任意のa,b,c,d,e等を使うと、コンパイラに宣言する必要がありました、配列を利用する事により複数の変数を使うようにする事が可能になります。

以下は文字型変数宣言【 char 】と配列を使用したサンプルです。

#include <stdio.h>
main()
{
char a[10];gets(a);
puts(a);}

『 char a[10];  』の部分です。【 char 】が文字型変数宣言です。【 a[10] 】が配列です。

配列 配列に指定した数字分が自動的に変数として利用可能になります。
例: a[5] とすると a0,a1,a2,a3,a4 までを変数として利用する事が出来ます。
例: b[100] とすると b0,b2,b3・・・・・・b99まで変数を用意する事ができます。
配列を使用すると最初は【 0 】から開始されます。【 0 1 2 3、、 】と言う具合に利用されます。これは重要なので覚えておいて下さいね。

配列を利用した文字入力の注意点

文字列(文字コード)を変数に代入した場合、何処までが文字列かと言う判断がC言語には必要な決まりです。
例えば a[10]に「ZZZ」と三文字代入させた場合 (Zの文字コードは90) a[0]←90 a[1]←90 a[2]←90 と代入され最後に文字列終端マーク a[4]←0 が代入されます。
この為 ZZZ三文字入力に辺り、用意する変数は4つ必要になります。したがって配列は裁定でもa[4]とする必要があります。もしこれにZZZZと4文字打ち込むとプログラムエラーとなってしまいます。

gets(a)にてキーボードからの文字を、a[0]~a[9]まで代入し、puts(a)にてa[0]~a[9]までの文字を出力します。
このサンプルの配列はa[10]としているので最大9文字までしか入力する事ができません。特にa[100]とされてもOKです。

以下実行結果です。

表現範囲とEOFについて説明

文字型変数宣言【 char 】の表現範囲と【 EOF 】に付いて勉強してみたいと思います。

キーボードから1文字入力し、そのまま出力するサンプルです。

#include <stdio.h>

int main(void)
{
int ch;

ch=getchar(ch);
putchar(ch);

return 0;

}

表現範囲とEOFの解説

【 getchar(); 】は文字入力を行うものですが、その文字を入れる変数に【 char 】型を使用すると上手く動作しないことがあります。次のように覚えておくと良いようです。

【 getchar() 】関数によるデーター入力は必ず【 int 】整数型変数宣言で受け取る
上記のサンプルを下記のように書いてしまうと、動作がおかしくなってしまう場合があります。

char ch;
ch = getchar();

以上のことをふまえて、下記のサンプル図を確認してみてください。

出力結果

char 表現範囲

※変数宣言を行う場合【 int 】や【 char 】【 float 】【 double 】等、、これらは扱うデーターの性格や表現範囲(戻り値)をそれぞれ規定により決まっております。
表現範囲はCコンパイラ開発者側でそれぞれ異なります。【 char 】文字型変数宣言の場合
一般的なCコンパイラの場合: -128~127までを扱う事が出来ます。
しかし従来のコンパイラの中には: 0~255 まで扱う事が出来るものもあります。
【 getchar() 】関数に付いては、キーボードから入力が終了した場合、【 -1 】と言う特別な値(【 EOF 】と言う名称が付けられています。)を返すようになっています。
ところが従来の【 char 】表現範囲0~255までのタイプだと -1 と言う値を255と判断してしまうと言う性格を持つ為、どのタイプのCコンパイラでも -1 を扱う事が出来る整数型変数宣言【 int 】にて変数を用意し、【 getchar() 】に入力された文字列を整数型の変数に代入して扱うと言うのが推奨されています。

【 EOF 】を使用したサンプル
文字入力を繰り返し処理するループ【 while 】を作成し、終了条件には【 EOF 】以外なら繰り返すにします。
キーボードから衆力終了を知らせるために「Ctrl」キー+「Z」キーにて終了【 EOF 】を知らせることが出来ます。

サンプルソースコード

#include <stdio.h>
int main(void)
{   int ch;ch =
getchar();while(ch != EOF){
putchar(ch);
ch =
getchar();
}
return 0;

解説図
入出力の関係に付いては最初に説明しました。それに【 while(ch != EOF) 】の繰り返し条件を付け加えただけです。
【 ch=getchar(); 】が二回記述されているのは、【 whil 】にてループ開始前に【 ch 】の値が決定されていなくてはならないと言う決まりと、ループしている間にも【 ch 】は更新していなくてはならないと言う決まりがあります。
ループを終了する条件はキーボードからCTRL+Zキーで【 ch 】にEOFが代入されます。

出力結果。

whileとgetcharの記述

char 表現範囲とEOFに付いて で【 while 】のループ条件にて【 getchar(); 】を用いる場合、ループに入る前とループ中にそれぞれ【 getchar(); 】の記述が必ず必要になるので、覚えておくと良いでしょう。

サンプルソースコード

#include <stdio.h>
int main(void)
{
int ch;while( (ch = getchar() ) != EOF ){
putchar(ch);
}return 0;
}

ソースコードの解説

【 while 】の条件の中に【 (ch=getchar()) 】と記述する事により、ループ条件判断する以前に【 getchar() 】を実行する為、二回【 getchar() 】を記述する必要がなくなります。

実行結果は次の通り。

配列を関数に渡す方法

配列を関数に渡す方法は「アドレスによる呼び出し」という方法を使います。
例:【 a[5] ={1,2,3,4,5} 】として、した場合それぞれ代入された値を呼び出す場合
例:【printf(“%d %d”,a[0], a[4])  】とすれば、【 0 5 】の出力結果が得られます。
配列関連で何度か勉強してきましたが。詳細は(配列文字配列初期化)を参照してみてくださいね。

#include <stdio.h>
void add_ress(int ad[]);int main(void)
{
int ad[5]={10, 20, 30, 40, 50};

add_ress(ad);

return 0;
}

void add_ress(int ad[])
{

printf(“ad[0]=%d\n”,ad[0]);
printf(“ad[2]=%d\n”,ad[2]);
printf(“ad[4]=%d\n”,ad[4]);
}

解説
関数の初期値を決め【 void add_ress 】関数で各アドレスの値を出力します。
関数初期値は以下のようになります。

a[0] a[1] a[2] a[3] a[0]
10 20 30 40 50

 

上記の初期値を関数の仮引数【 int(ad []) 】に渡し、出力したいアドレスを【 printf 】にてアドレスを指定。
例えば、a[1]の値を呼び出す場合は【 void add_ress(int ad[]) 】関数内に、
【 printf(“%d”,ad[1]) 】とすれば、20が実行結果に出力されます。

実行結果

 

コメント

タイトルとURLをコピーしました