質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

5回答

911閲覧

A1~C3または1A~3Cまでの値を判定したい

gyoruo

総合スコア61

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/08/04 00:58

編集2020/08/04 00:59

ゲームの座標判定でA1C3または1A3Cまでを座標判定したいのですが、下記の画像のようにうまく判定できていません。
また、このif文だと座標が増えた場合に書く量が膨大になってしまいます。
質問したいことは、
・なぜ下記のコードで判定できていないのか
・座標が増えた場合の今よりも簡単なif判定のアドバイス
をお願いします。
イメージ説明

C

1#include <stdio.h> 2#include <string.h> 3 4#define MAXDATA 255 5#define DATA 4 //自分の環境ではAなどが2バイト、1などが1バイトのため、最後に¥nを含めた 6          // 4バイトにしています。(念のため、DATA 10などにもしてみましたがうまくいきませんでした) 7 8int main(void) { 9 char xy[DATA] = { }; 10 char flag = 0; 11 char xy_last = 0; 12 13 while (flag == 0) { 14 printf("A1または1Aと入力してください\n"); 15 16 fgets(xy, MAXDATA, stdin); 17 18 // 配列の最後を¥0にする(表示させる時の改行を防ぐ) 19 xy_last = strlen(xy) - 1; 20 xy[xy_last] = '\0'; 21 22 if (strlen(xy) <= DATA) { 23 // (1~3, A~C)または、(A~C, 1~3)までで入力判定させたい 24 if (((xy == "A1" || xy == "A2" == xy == "A3") || (xy == "1A" || xy == "2A" == xy == "3A") || (xy == "B1" || xy == "B2" == xy == "B3") || (xy == "1B" || xy == "2B" == xy == "3B") || (xy == "C1" || xy == "C2" == xy == "C3") || (xy == "1C" || xy == "2C" == xy == "3C"))) { 25 printf("正しい入力です。\n"); 26 flag++; 27 } 28 } 29 } 30 31 return 0; 32} 33 34```

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuma-s

2020/08/04 02:26

> //自分の環境ではAなどが2バイト、1などが1バイトのため、 文字コードが Shift-JIS で、「A]は全角文字で入力しているんですか? また、「1」は、全角の「1」ではなく、半角の「1」ですか?
gyoruo

2020/08/04 02:30

すみません、UTF-8なのでAも1バイトでした。1も半角なので1バイトです。
guest

回答5

0

C

1#include <stdio.h> // puts, fgets, sscanf 2 3#define MAXDATA 255 4 5int main(void) 6{ 7 char xy[MAXDATA], c; 8 do { 9 puts("A1または1Aと入力してください"); 10 fgets(xy, MAXDATA, stdin); 11 } while ((sscanf(xy, "%*1[A-C]%*1[1-3]%c", &c) != 1 || c != '\n') 12 && (sscanf(xy, "%*1[1-3]%*1[A-C]%c", &c) != 1 || c != '\n')); 13 xy[2] = '\0'; 14 puts("正しい入力です。"); 15}

見たことのない関数がありますか?

投稿2020/08/04 02:59

編集2020/08/04 03:02
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gyoruo

2020/08/04 04:27

わざわざ書き直してくれたんですね! ありがとうございます! sscanfは見たことないですが概要などを調べて理解してみます!
guest

0

xy == "A1" は、xy配列の先頭要素へのポインターと、(どこかに配置されている)"A1"という配列の先頭要素へのポインターが一致しているか、という判定です。
ご希望の処理になっているでしょうか?

投稿2020/08/04 02:28

YT0014

総合スコア1708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gyoruo

2020/08/04 02:31

ご回答ありがとうございます! 意味は理解できましたが、そのような処理では実現できないので他の方法を考えてみます。
guest

0

・なぜ下記のコードで判定できていないのか

y_waiwaiさんの回答の通りです。

・座標が増えた場合の今よりも簡単なif判定のアドバイス

座標が16進文字列なら数値に変換すれば比較演算子で範囲チェックできますが、
飛び飛びの座標の場合ハッシュを作成してハッシュにあるか否かを判定した方が
可読性が高いと思います。
ハッシュ実装は以下をご参考に
お気楽C言語プログラミング超入門

投稿2020/08/04 01:43

DreamTheater

総合スコア1095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gyoruo

2020/08/04 01:46

そんな方法もあったんですね! 見てみます!
guest

0

C

1#include <stdio.h> 2#include <string.h> 3#include <stdbool.h> 4#include <ctype.h> 5 6#define DATA 4 7 8int main(void) { 9 char xy[DATA]; 10 bool invalid = true; 11 12 while ( invalid ) { 13 printf("A1または1Aと入力してください\n"); 14 15 fgets(xy, DATA, stdin); 16 17 // 配列の最後を¥0にする(表示させる時の改行を防ぐ) 18 xy[strlen(xy) - 1] = '\0'; 19 if ( strlen(xy) == 2 ) { 20 char a = xy[0]; 21 char n = xy[1]; 22 if ( !isalpha(a) ) { char c = a; a = n; n = c; } 23 // a が A,B,C のいずれか かつ n が 1,2,3 のいずれか ならば正しい入力 24 if ( strchr("ABC",a) != NULL && strchr("123",n) != NULL ) { 25 printf("正しい入力です。\n"); 26 invalid = false; 27 } 28 } 29 } 30 31 return 0; 32}

投稿2020/08/04 01:34

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gyoruo

2020/08/04 01:41

ご回答ありがとうございます! 見たことない関数ばかりなので、1度調べてみますね!
episteme

2020/08/04 02:02

標準関数は使わにゃ損ですから♪
guest

0

ベストアンサー

C言語では文字列の直接の比較はできません
strcmp関数を使いましょう

  xy == "2B" == xy == "3B"

また、こういう比較もできません

投稿2020/08/04 01:04

編集2020/08/04 01:08
y_waiwai

総合スコア87800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gyoruo

2020/08/04 01:28

ご回答ありがとうございます! strcmpを用いてできたのですが、defineや配列で"A1"などを定義すると、座標の数だけ定義しなければならないのですが、仕方のないことなのでしょうか?
y_waiwai

2020/08/04 01:34

どういう座標の名付けになってるかわかってないですが、 Aを100、Bを110とかにして、数値で座標を表すようにすれば、演算と比較で対応できます
gyoruo

2020/08/04 01:38

ご回答ありがとうございます。 自分もそうしたかったのですが、仕様でA1と2次元配列を組み合わせないといけないらしく数値で座標指定ができないんです。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問