天国にいけるC言語入門 ヘキサ構造体 ver5.2130
if文とヘッダファイル<string.h>に格納されているstrcmp関数を使って 入力された文字列によって実行される命令文が変わるプログラムを作成してみましょう。
if文とヘッダファイル<string.h>に格納されているstrcmp関数を使って 入力された文字列によって実行される命令文が変わるプログラムを作成してみましょう。
アレサ「if文とscanf関数をつかって
次のプログラムのように→」
#pragma warning(disable: 4996)
#include <stdio.h>
int main(void){
int a;
scanf("%d",&a);
if(a==0)
printf("にゃんにゃん\n",a);
else
printf("にょお~ん",a);
return 0;
}
コンパイル結果
0(と入力すると)
にゃんにゃん(が表示されます)
アレサ「→
scanf関数によって
コマンドプロンプト画面から入力された数値が
0であるか0でないかで
表示される文章を選択し
にゃんにゃん
か
にょお~ん
を表示させることができます
今度は
コマンドプロンプト画面から
入力された文字列によって表示される文章が
変わるよう
if文の条件式の部分に
strcmp関数を使ってみましょう。
strcmpは
string(文字列)
compare(比較してみる)
を組み合わせた造語です。
strcmp関数はヘッダファイル<string.h>に格納されていますので
使用するときには
プログラムの始めに
ヘッダファイル<string.h>をインクルードします。
strcmp関数を実行するには
strcmp(文字列データa,文字列データb);
のように表記します
文字列データその1と文字列データその2が同じ文字列データaの場合
strcmp(文字列データその1,文字列データその2)は0というデータ(戻り値)
を持つよう設定されています
次のプログラムで
その様子を観察してみましょう。」
#include <stdio.h>
#include <string.h>
int main(void) {
if (strcmp("みゃお~ん", "みゃお~ん") == 0)
printf("にゃんにゃん\n");
return 0;
}
EAZY IDECの場合
Visual Studioの場合
コンパイル結果
にゃんにゃん
アレサ「
数学におけるf(x)=x+1のxに数値1が代入されると
f(1)=2の値をもつように
strcmp("みゃお~ん", "みゃお~ん") は0というデータ(戻り値)を
持つというわけです
ですので
if (strcmp("みゃお~ん", "みゃお~ん") == 0)
は
if (strcmp(0== 0)
と等しくなり
if (strcmp("みゃお~ん", "みゃお~ん") == 0)
に続く命令文
printf("にゃんにゃん\n");
が実行され
コマンドプロンプト画面に
にゃんにゃん
が表示されることになります
では
次のプログラムをご覧ください
余裕をもってコマンドプロンプト画面から入力された文字列をデータをうけとれるよう
配列hairetuの要素数は10000にしてあります
配列hairetuの要素数は10000にしてあると
9999文字の文字列データを配列に格納することができます
のこりの1文字は自動的に'\0'が格納されることになります
」
#pragma warning(disable: 4996)
#include <stdio.h>
#include <string.h>
int main(void){
char hairetu[10000];
scanf("%s",hairetu);
if(strcmp(hairetu,"みゃお~ん")==0)//←注目ポイントはここです
printf("にゃんにゃん\n");
else
printf("にょお~ん\n");
return 0;
}
コンパイル結果
みゃお~ん(と入力すると)
にゃんにゃん
と表示されます
アレサ「また
strcmp関数は
strcmp(配列名,文字列データ);
strcmp(文字列データ,配列名);
のように記述することもできます
例えば
strcmp関数は
プログラム内で
if(strcmp(hairetu,"みゃお~ん")==0)
のように用いることもできます
つまり
scanf("%s",hairetu);
により
文字列データが格納されるはずの配列hairetuの
アドレスが格納されているポインタ変数
hairetuを
strcmp関数の第1引数に
文字列データを直接記入する代わりに
かきこむことができます。
コンパイル後
アンダーバー
_
が表示される入力待ち受け状態の
コマンドプロンプト画面から
scanf関数をつかって配列 hairetuに
文字列データ"みゃお~ん"が格納された場合
strcmp(hairetu,"みゃお~ん")は0という戻り値を持つよう
に設定されています。
ですので
if(strcmp(hairetu,"みゃお~ん")==0)の中の
(hairetu,"みゃお~ん")==0
は
0==0
となります
すなわち
0==0
という論理式は
真の値1
という値を持つことになります
if(strcmp(hairetu,"みゃお~ん")==0)
は
if(0)
となるので
if(strcmp(hairetu,"みゃお~ん")==0)
に続く命令文
printf("にゃんにゃん\n");
が実行され
コマンドプロンプト画面に
にゃんにゃん
が表示されます。
コンパイル後の入力待ち受け状態のコマンドプロンプト画面で
にゃあああおお~ん
と入力すると
if(strcmp(hairetu,"みゃお~ん")==0)
は
if(0)
となるので
printf("にゃんにゃん\n");
のかわりに
elseに続く命令文
printf("にょお~ん\n");
が実行され
コマンドプロンプト画面に
にょお~ん
が表示されます。」
アレサ「ねこちゃん同士のあいさつのようですね。
みゃお~ん
という言葉に対して
にゃんにゃん
と
返しているというわけですの。」
ソーラー「ねこのあいさつか・・・
これって
パスワードを入力すると
管理画面が開く
というところで使われてそうだね」
アレサ「また
strcmp関数は
プログラム内で
if(strcmp(hairetu,"みゃお~ん")==0)
でなく
if(strcmp("みゃお~ん",hairetu)==0)
のように用いることもできます
つまり
scanf("%s",hairetu);
により
文字列データが格納されるはずの配列hairetuの
アドレスが格納されているポインタ変数
hairetuを
strcmp関数の第2引数に
文字列データを直接記入する代わりに
かきこむこともできます。
#pragma warning(disable: 4996)
#include <stdio.h>
#include <string.h>
int main(void){
char hairetu[10000];
scanf("%s",hairetu);
if(strcmp("みゃお~ん",hairetu)==0)//←注目ポイントはここです
printf("にゃんにゃん\n");
else
printf("にょお~ん\n");
return 0;
}
コンパイル結果
みゃお~ん(と入力すると)
にゃんにゃん
コンパイル後
アンダーバー
_
が表示される入力待ち受け状態の
コマンドプロンプト画面から
scanf関数をつかって配列 hairetuに
文字列みゃお~んが格納された場合
strcmp(hairetu,"みゃお~ん")は0という戻り値を持つよう
に設定されています。
ですので
if(strcmp("みゃお~ん",hairetu)==0)は
if(0==0)
となり
if(1)
成立するので
if(strcmp("みゃお~ん",hairetu)==0)に続く命令文
printf("にゃんにゃん\n");
が実行され
コマンドプロンプト画面に
にゃんにゃん
が表示されます。
コンパイル後の入力待ち受け状態のコマンドプロンプト画面で
にゃあああおお~ん
と入力すると
if(strcmp("みゃお~ん",hairetu)==0)は
0==0が成立せず
if(0)
となるので
printf("にゃんにゃん\n");
のかわりに
elseに続く命令文
printf("にょお~ん\n");
が実行され
コマンドプロンプト画面に
にょお~ん
が表示されます。」
さらに
配列hairetu1
に文字列データを格納しておいて
配列hairetu2
にも文字列データを格納しておいて
strcmp(hairetu1,hairetu2);
を実行することもできます
strcmp(hairetu1,hairetu2);
が実行されたとき
もし
配列hairetu1
と
配列hairetu2
に格納されている文字列データが
同じ文字列データなら
strcmp(hairetu1,hairetu2)は0という戻り値を持つよう
設定されています
strcmp(hairetu1,hairetu2)が用いられた
プログラムはこちらです
#include <stdio.h>
#include <string.h>
int main(void) {
char hairetu1[10000] = "にゃお";
char hairetu2[10000] = "にゃお";
if (strcmp(hairetu1, hairetu2) == 0)//←注目ポイントはここです
printf("にゃんにゃん\n");
else
printf("にょお~ん\n");
return 0;
}
EAZY IDECの場合
Visual Studioの場合
コンパイル結果
にゃんにゃん
アレサ「このプログラムでは
配列hairetu1
と
配列hairetu2
に格納されている文字列データが
同じ文字列データ"にゃんにゃん”なので
strcmp(hairetu1, hairetu2) は0という戻り値をもち
strcmp(hairetu1, hairetu2) == 0
は
0==0
となり
論理式
0==0
は真の値1をもつことになるので
if (strcmp(hairetu1, hairetu2) == 0)
に続く命令文
printf("にゃんにゃん\n");
が実行され
コマンドプロンプト画面に
文字列
にゃんにゃん
が
表示されていますね」
🌞 🌞 🌞
次のプログラムのように
if(strcmp(hairetu,"みゃお~ん")==0)と表記しなくても
if(hairetu=="みゃお~ん")と表記することにより
strcmp関数をつかわなくても配列に入力された文字列データによって
表示される文章を変更できそうな気がします
#pragma warning(disable: 4996)
#include <stdio.h>
#include <string.h>
int main(void){
char hairetu[10000];
scanf("%s",hairetu);
if(hairetu=="みゃお~ん")/*この部分を変更しました*/
printf("にゃんにゃん\n");
else
printf("にょお~ん\n");
return 0;
}
コンパイル結果
みゃお~ん(と入力すると)
にょお~ん
このプログラムをよくみると
みゃお~んと入力されて
if(hairetu=="みゃお~ん")の
hairetu=="みゃお~ん"
が成立して
if(1)
となるようにみえますが
にゃんにゃん
が表示されていないのがわかります。
このように
入力された文字列によって
表示される文章を変更するためには
if文の条件式にstrcmp関数を使う必要があります。
先のプログラムでは
👇
#pragma warning(disable: 4996)
#include <stdio.h>
int main(void){
int a;
scanf("%d",&a);
if(a==0)
printf("にゃんにゃん\n",a);
else
printf("にょお~ん",a);
return 0;
}
コンパイル結果
0(と入力すると)
にゃんにゃん(が表示されます)
👆
入力された数値データによって
表示される文章を変更するためには
if(a==0)と表記するだけでよかったのに
面白い仕組みとなっていますね。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます