c言語のif文の条件について
最近c言語の勉強をし始めたものです
以下のようなif文の条件の書き方を教えてください。
キーボード入力(key)から
自然数を入力→
● a を入力で処理1へ
● b を入力で処理2へ
● c を入力で処理3へ
例
入力:10a →処理1
入力:80c→処理3
入力:5b→処理2
これに合うような条件文はどう書けばよろしいでしょうか。
if(key==数字)
{
if(key==a)
{
処理1;
}
}
↑をa,b,cの3つ作るのでしょうか?
もっと簡単な書き方があれば教えてください
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答6件
0
こんなふうに出来そうです。
C
1int num; 2char ch; 3 4int ret = scanf("%d%c", &num, &ch); // 一時変数retは省いても良いが、可読性はやや落ちる 5if(ret != 2) { 6 exit(1); 7} 8 9switch(ch) { 10 略 11}
10ab
というような入力は考慮していませんのでご注意ください。
scanfを使う際に注意すべきことについて
上記のコードで、危険が生じ得る部分は次の二か所です。
オーバーフローを感知できないこと
例えば10000000000000000000000000a
などという入力に対しては未定義の動作となります。
業務で使うコードでは避けるべきです。しかし、個人で使う分には無視して良いように思います。
悪意を持った人でない限りそんな入力しないからです。
入力の最大桁数を決め打てるのなら、次のように書いても回避できます。
C
1scanf("%2d%c", &num, &c);
バッファに食べ残しができること
10ab
と入力するとb\n
が、10a
と入力すると\n
がバッファに残ります。
入力処理を何度かにわたって行う場合に注意が必要です。
標準入力をクリアするためのコードとしてfflush(stdin)
がよく紹介されています。
しかし、これは規格上未定義の動作を引き起こす(らしい)ので、使うべきでないです。
きじねこ - [迷信] fflush で入力バッファをクリア
改行文字まで空読みするのが確実な方法です。
C
1while(getchar() != '\n');
結局のところ
- fgets + strtol でがっつりセキュアなコードを書くか
- scanf でお手軽に書くか
どっちかじゃないですかね。中途半端なのが一番良くないと思います。
書いてみた:比較的安全なコード
調べながら書きましたが、これでも見落としがある気しかしないです。
参考
C
1#include <ctype.h> 2#include <errno.h> 3#include <stdio.h> 4#include <stdlib.h> 5#include <string.h> 6 7int main(void) { 8 char buffer[14 +1+1] = {0}; // + newline + null 9 10 // get input 11 { 12 char *ret = fgets(buffer, sizeof(buffer), stdin); 13 if(ret == NULL) { 14 fprintf(stderr, "Failed: At fgets.\n"); 15 exit(1); 16 } 17 18 char *nl = strchr(buffer, '\n'); 19 if(nl) { 20 *nl = '\0'; 21 } 22 else { 23 while(1) { 24 int ret = getchar(); 25 if(ret == '\n') { 26 fprintf(stderr, "Failed: Too long input.\n"); 27 break; 28 } 29 if(ret == EOF) { 30 fprintf(stderr, "Failed: Input must end with a linefeed.\n"); 31 break; 32 } 33 } 34 35 exit(1); 36 } 37 38 if(strlen(buffer) == 0) { 39 fprintf(stderr, "Failed: Empty input.\n"); 40 exit(1); 41 } 42 } 43 44 int num; 45 char type; 46 { 47 char *begin = buffer; 48 char *end; 49 50 // parse integer 51 errno = 0; 52 const long sl = strtol(begin, &end, 10); 53 54 if(begin == end) { 55 fprintf(stderr, "Failed: Integer parsing.\n"); 56 exit(1); 57 } 58 if( 59 // NOTE: これ errno 見るだけじゃダメなのだろうか...? 60 (sl == LONG_MIN || sl == LONG_MAX) && errno == ERANGE 61 ) { 62 fprintf(stderr, "Failed: Overflow is occurred.\n"); 63 exit(1); 64 } 65 if(sl < INT_MIN) { 66 fprintf(stderr, "Failed: %ld is less than INT_MIN\n", sl); 67 exit(1); 68 } 69 if(INT_MAX < sl) { 70 fprintf(stderr, "Failed: %ld is greater than INT_MAX\n", sl); 71 exit(1); 72 } 73 74 num = sl; 75 begin = end; 76 77 // parse type 78 if(strlen(begin) != 1) { 79 fprintf(stderr, "Failed: Invalid format.\n"); 80 exit(1); 81 } 82 83 type = *begin++; 84 85 // 文字コードが連続していると仮定: 86 // http://www.kijineko.co.jp/tech/superstitions/A-to-Z-is-sequence.html 87 if ('A' <= type && type <= 'Z'); 88 else if('a' <= type && type <= 'z'); 89 else { 90 fprintf(stderr, "Failed: Invalid type character '%c'.\n", type); 91 exit(1); 92 } 93 } 94 95 printf("num: %d, type: %c\n", num, type); 96 97 return 0; 98}
『不正な入力がない』と仮定できるなら、これは次のコードに置き換えられます。
C
1#include <stdio.h> 2 3int main(void) { 4 int num; 5 char type; 6 7 scanf("%d%c", &num, &type); 8 printf("num: %d, type: %c\n", num, type); 9 10 return 0; 11}
これに気休めでちょっとだけエラーチェックを加えると、回答先頭のコードになるわけです。
投稿2018/06/21 14:02
編集2018/06/23 17:04総合スコア35678
0
if condition is like a gatekeeper or guard.
if(number > 0 ) // then come in
else
// get out
char gate = '\0';
gate = getche();
or try this
scanf("%c",&gate);
if(gate == 'a') // process 1
else if(gate == 'b') //process 2
else if(gate == 'c') // process 3
投稿2018/06/22 17:30
総合スコア351
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
if文の書き方だけで言えば、それほど簡単にはできないと思います。
if・・・ else if ・・・
の連続になります。
3個ぐらいなら、switch も if も同じようなものでしょう。
入力可能な数字が「小さくて、とびとびな値ではない」場合は、関数ポインタの配列を使う方法があります。
「小さくて、とびとびな値ではない」とは、入力可能な数字が
1, 30, 5000
とかではなく、
1, 2, 3
のような場合です。
関数ポインタの配列の例
この例では、四則演算の関数を呼び出しています。(128個の要素を持つ配列を作っていますが)
投稿2018/06/22 01:35
総合スコア711
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
C
1if(key==a) 2 3```は、変数keyを変数aと比較するif文ですよ。aという文字は 'a' です。 4 5 6分割して考えてください。 71.キーボードから数字列に続いてアルファベットが一文字入る前提。 82.数字列部分を10数値とみなしてint変数numに入れる 93.続くアルファベット1文字をchar変数keyに入れる 104.処理分岐 11 12処理分岐のところはこれでいいでしょう。 13 14```C 15if(key=='a'){ 16 処理1; 17}else if(key=='b'){ 18 処理2; 19}else if(key=='c'){ 20 処理3; 21}else { 22 想定外の入力の処理 23} 24
elseをつけておかないと、処理1の中でkeyの値を変化させて'b'や’c’に変えてしまった場合に処理2や3が引き続いて実行されてしまいます。
分岐が今後もっと増えるのならswitch文の習得をお勧めします。
投稿2018/06/22 00:57
総合スコア702
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは、私が試した方法の説明をします。
まず初めにchar text[3][10] = {"10a","5b","80c"};
を用意します。
1.fgetsで文字列の入力を受け付ける。
2.最後の改行を消す。
3.strcmpで比較し、一致したら変数typeに(その番号 + 1)を代入する。
例えば入力した文字が10aだったらtype = 1になります。
4.typeに応じた処理をswitch文で処理する。
これは入力した文字が3つのどれとも一致しなかった場合にdefaultで対処するためです。
以下、私が書いたソースコードを載せておきます。
C
1#include <stdio.h> 2#include <string.h> 3 4#define BUFSIZE 1024 5 6int main(void) 7{ 8 char text[3][10] = {"10a","5b","80c"}; 9 char buf[BUFSIZE]; 10 int i; 11 int type = -1; 12 13 for(i = 0; i < 3; i++){ 14 printf("%sを入力 -> 処理%d\n",text[i],i + 1); 15 } 16 fgets(buf,sizeof(buf),stdin); 17 buf[strlen(buf) - 1] = '\0'; 18 for(i = 0; i < 3; i++){ 19 if(strcmp(buf,text[i]) == 0){ 20 type = i + 1; 21 } 22 } 23 switch(type){ 24 case 1: 25 printf("処理1\n"); 26 break; 27 case 2: 28 printf("処理2\n"); 29 break; 30 case 3: 31 printf("処理3\n"); 32 break; 33 default: 34 printf("何もしない\n"); 35 break; 36 } 37 return 0; 38}
投稿2018/06/21 23:05
編集2018/06/24 09:13
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/22 08:32 編集

退会済みユーザー
2018/06/23 10:11
2018/06/23 16:20
2018/06/23 23:34

退会済みユーザー
2018/06/24 09:02

退会済みユーザー
2018/06/24 09:17
2018/06/24 10:16 編集
2018/06/24 11:03 編集

退会済みユーザー
2018/06/25 05:12
2018/06/25 09:12

0
キーボードからの入力 fgets 関数
文字列から整数への変換 strtol関数
ピント外れついでに。
無理してif使わずに、switch使いましょう
ちょっとはスッキリします
C
1switch(key){ 2case 'a': 3 // 数字の処理A 4 break; 5case 'b': 6 // 数字の処理B 7 break; 8case 'c'; 9 // 数字の処理C 10 break; 11default: 12 // aでもbでもcでもない場合 13 break; 14}
投稿2018/06/21 14:00
編集2018/06/22 01:54総合スコア88178
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/06/21 23:08
2018/06/22 00:15 編集
退会済みユーザー
2018/06/22 00:40 編集
2018/06/22 00:47 編集
退会済みユーザー
2018/06/22 01:05
2018/06/22 01:11
2018/06/22 04:01 編集
2018/06/22 03:57
2018/06/22 11:27 編集
2018/06/22 11:47
退会済みユーザー
2018/07/21 03:36 編集
退会済みユーザー
2018/07/21 03:36 編集
2018/06/23 09:52
2018/06/23 10:03
退会済みユーザー
2018/07/21 03:36 編集
2018/06/23 10:44
2018/06/23 17:11