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)と表記するだけでよかったのに


面白い仕組みとなっていますね。

  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る