はじめに
こんにちは
今回はC言語#1で作成したコードの解説から入りたいと思います。
その後はprintf関数以外にscanf関数について簡単に解説いたします。
前回のおさらい
前回#1の最後辺りで文字を表示させるだけのコードを作成いたしました。
#include <stdio.h>
int main(void)
{
printf("C言語へようこそ\n");
return 0;
}
そして実行するとこのような画面が表示されることを確認いたしました。
ではここからこのコードについて1行ずつ解説いたします。
コードの解説
コードの中に大まかな解説を入れましたのでご覧ください。
// ここにプログラムを書いていきます。
//「//」「/**/」はコメントアウトという意味です。プログラムには反映されません
#include <stdio.h> // 標準C言語ライブラリです。これがないとprintf()が使用できません。
/**************************************************************************************
C言語で書かれたプログラムは、まず「main関数」から実行されることになっています。
「int main(void){」から始まり「}」までが「main関数」です。
***************************************************************************************/
int main(void)
{
/***************************************************************
「printf」という名前の関数を使用します。
この関数を使用することで実行時に入力した文字が表示されます
書式:printf("「入力したい文字」");
****************************************************************/
printf("C言語へようこそ\n");
/***********************************************************************************
「return 0;」は簡潔に言うと「main関数を終了させる」という意味です。
「main関数」が終了するとプログラムも終了することになっています。
その結果、「return 0;」と言う行が実行されるとプログラムが終了します。
************************************************************************************/
return 0;
}
コードの補足
#include <stdio.h> // includeは「含める・入れる」という意味です。
・stdio.h ->「.h」はヘッダーファイルを意味します。
ヘッダーファイル
関数などの宣言のみを記したファイルです。ヘッダーファイルは他にも
math.h(数学系関数)、stdlib.h(ライブラリ) など沢山あります。
stdio.hは入出力系のヘッダーファイルです。printf()は出力系の関数です。つまりこのヘッダーファイルを含めないとこのprintf()というのは使えないことになります。なので記載されてないとエラーが出てしまうので注意です。
因みにstdioとは「(std)standard (i)input/(o)output(標準入出力)」の略称です。
stdlibなら「standard library(標準ライブラリ)」の略称になります
int main(void)
{
return 0;
}
・「int」は整数型を表してます。この関数を実行すると何かしらの整数値が返ってきます。
・「main」は関数を表してます。サンプルコードは関数が1つだけなで関数名が「main」になります。
・「void」は引数が無い場合に使います。「この関数は引数を取らないすな」という意味です。なので…
int main()
{
return 0;
}
このように「void」を省略しても良いですし
void main()
{
// void main()とする場合、返り値return 0;は不要
}
このように記載する方法もあります。しかしvoid main()は正当な使用方法があまりないため予期せぬエラーや無効な値が返ってくることがあります。あまり良い方法ではありませんがこういう書き方もできるのかぁで良いと思います。
void main()と書いても良いのか?
scanf()
先ほどはstudio.hを入れないと入出力系の関数が使えないのです~というように解説しました。printf()は出力系の関数でしたが入力系の関数にscanf()(スキャンエフ) というものがあります。
scanf関数を使うとキーボードで文字や数値を入力することができます。
しかしscanf関数は書式が必要なため変数というものを指定しなければなりません。
変数
値を入れるための箱を変数と言います。
コンピュータの頭脳であるCPUは、計算などの処理をしても、その結果をメモリ(記憶領域)に入れておかないとすぐに忘れてしまいます。ですので、計算結果などは変数(メモリ領域)に入れて利用します。
また変数は、名前を付けることができます(変数名)
そして変数を使うには宣言が必要です。
あらかじめコンピュータに「変数を使います」と伝える処理です。
宣言されてない変数を使おうとするとエラーになります。
ではscanf関数に戻って…
図のようにscanf関数の書式は、printf関数のときと同じように、書式指定子によって用意した変数にどんなデータを代入するのか指定します。
しかしscanf関数はprintf関数と違って、変数のアドレスを指定しなければなりません。
そのためにアドレス指定子「&」をつけます ←重要です
書式指定子
ざっくりとよく使うものを紹介します。
printfでもscanfでも適切に指定しないと正しく入力や表示ができないので注意!
フォーマット指定子一覧表
書式指定子 | 意味 | 対応するデータ型 | 備考 |
---|---|---|---|
%d | 10進整数 | int | |
%f | 実数 | float,double | double型変数に入力する時は%lfを使う |
%c | 文字 | char (intなど) | |
%s | 文字列 | char型配列のアドレス(ポインタ) | scanfでは&をつけない |
%x | 16進整数 | intやchar | |
%hd | short int | ||
%ld | long int |
scanfのサンプルコード
ではこれらの情報を活用してコードを作成してみましょう。
今回も超シンプルです。
#include <stdio.h> // 標準C言語ライブラリです。
int main()
{
// 変数宣言.
int number; // intなので入力した数値はすべて整数値が返ってきます.
// 入力処理.
printf("\nキーボードで数値を入力してください:");
scanf("%d", &number);
// 表示.
printf("入力した数値は%dです:\n",number);
return 0;
}
では実行してみます。
試しに100と入力します。
正しく100が返ってきました。
ではint型の状態で文字や実数を入力した場合どうなるか試してみます。
3.14と入力したら3と返ってきました。
そうですint型は10進整数値を返すので小数点以下の部分は表示されません。
float number;
scanf("%f", &number);
printf("入力した数値は%fです\n",number);
floatと%fに変更して再度実行してみましょう
これで正しく実数が表示されましたね!…でもなんか残りの0が気になりますね
そんな時は…
printf("入力した数値は%.2fです\n",number);
%fの間に.2を入れてみました。これで小数点以下第二位まで表示させます。
因みに「%.1f」なら3.1となり「%.3f」なら3.140というように表示されます。
小数点以下の扱いについてはこちら
今度は文字列で試してみます。
int型は整数値が返ってくるので文字列は表示されないのが確認できます。
従ってintではなくcharと%cに変更します
あれ、文字列は表示されましたが1字だけですね
そうです。charで「%c」と指定した場合、返ってくるのは文字列1字だけです。
なので複数表示したい場合は「%c」ではなく「%s」とします。
// charを扱う場合に[字数容量]を指定します。膨大な量でないなら8や16、32や64辺りが無難です
char number[16];
scanf("%s", &number);
printf("入力した値は%sです\n",number);
因みに・・・
Visual Stdio内で下の方にこんな表示が出ているのを見つけました。
どうやらscanf("%d",&number);の部分で警告が出ているようです。
別にこのぐらいのコードで警告出てもほぼ気になりませんが…
一応対処方法があるので実施します。
(void)scanf("%d",&number);
scanf関数の頭に (void)を加えます。
これで終わりです。
警告が消えたのも確認できました。
「void」は簡単に値を無視するという意味でした。
何も書かないと、そこに値があるのに気付かずに無視しているのかな?とコンパイラに思われてしまいます。そこは分かってるけど見ないことにしていますよと言う、そういった意思表示で頭に(void)をつけることでこの警告は出なくなります。
おわりに
入出力関数(printfとscanf)の仕組みについていかがだったでしょうか。
少しでもこの関数のイメージがつきましたら幸いです。
最後まで読んで頂きありがとうございました!
「サイト」
scanf関数の扱い方
「サイト」
C言語-プログラムの基本