- 締切済み
char型とint型セットの配列
Cのプログラミングの課題をやっているのですが、初心者で自分では解決できそうになく、投稿させていただきました。 Make Fiveというゲームをもとにした課題で、アルファベット一文字と数字(250までの整数)を25セットユーザーに入力してもらった後(例:s10 e3 c6)、5x5のマス目のどこにカードを入力したいかを順次決めてもらいます。 すべてのマス目が埋まったのち、縦、横からアルファベットを読んでいき、意味のある文字になっていればアルファベットとセットになっている数字の合計が得点になります (例:y1, o2, u3 と横にカードが続いていればyouという単語になるので 1+2+3=6点)。 今、つまずいているのは、最初のカードの入力のところです。 最初は構造体を使うのだろうと思い下記のようなコードをかいたのですがうまくいきません (いじっているうちにさらに変になってしまったようです…。) 最初は isNum isAlphとかの条件をいれずに書き、そのときは アルファベットと数字をスペースをあけて入力すると(例:q 1)うまくいきましたが、スペースなしで入力すると 数字も文字扱いされてしまいうまくいきません。getcharとかsprintfを使うのかもとも思い、いろいろ調べてみたのですが、どうもよくわかりません。 今は、isNumとかの条件をいれたせいでコンパイルもできなくなってしまいました…。どのような感じでプログラムをしていけばいいのでしょうか?長文で申し訳ありませんが、よろしくお願いします。 // Boolean constants #define TRUE 1 #define FALSE 0 #define MAXCARD 25 #define MAXROW 5 #define MAXCOLUMN 5 typedef char strAlph[1]; typedef int intNum; struct tCard{ intNum scoreNum; strAlph alph; }; struct tPlaceCard{ struct tCard; intNum cardRow; intNum cardCol; }; int main(int argc, char **argv){ int i=0, j=0; struct tCard eachCard[MAXCARD]; int table[MAXROW][MAXCOLUMN]; int row=0, col=0; int isNum=FALSE; int isAlph=FALSE; //Obtain cards printf("Enter 25 cards and their values: "); for(i = 0; (i < MAXCARD && isNum==FALSE && isAlph==FALSE); i++){ if(scanf("%s %d",eachCard[i].alph,&eachCard[i].scoreNum)==2){ if((*eachCard[i].alph >= '0')&&(*eachCard[i].alph <= '9')){ printf("Input Error\n"); isNum=TRUE; }else if((eachCard[i].scoreNum<='0')&&(eachCard[i].scoreNum>='9')){ printf("Input Error\n"); isAlph=TRUE; } }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- akayoroshi
- ベストアンサー率50% (46/91)
文字配列strを用意して、そこに、いったん、%sの変換で英字とそれに区切りなしで続く数字列を読み取ってから、それをsscanfで英字と数値に切り分けるということでしょう。 char str[10], alpha; int num; scanf("%s",str); sscanf(str,"%c%s",&alpha,&num);
- asuncion
- ベストアンサー率33% (2127/6289)
>typedef char strAlph[1]; 要素数1の配列は、配列にする意味がありません。 >}else if((eachCard[i].scoreNum<='0')&&(eachCard[i].scoreNum>='9')){ '0'以下で、かつ'9'以上という条件を満たすことはありません。 アルファベット1文字と250までの整数を読むのであれば、 sscanf(str, "%c%d", &ch, &num); のようにすればよいのではないでしょうか。
補足
迅速な回答をありがとうございます!! さっそくsscanfを使うことで入力できるようになったのですが、でも今度は課題のスペックに合わせられません…。 ユーザーの入力方法は下記の3つに対応しなければならないのですがsscanfをつかうと3)のみになってしまいます。 1) q1 w2 e3 f3 2) q1w2e3f3 3) q1 [ENTER] w2 [ENTER] f3[ENTER] そこで -Loop- scanf("%c",&ch); scanf("%d,&num); -Loop- とscanfを使ってみたのですが、この場合は1)の入力方法しかできません。調べてみるとscanfは空白を区切りとらえるとのことなのでこの方法は使えないということですよね? sscanfも調べたんですがサンプルコードはループを使ってバッファーから配列に格納しているものはなく、また先に進めなくなりました…。 さらなるご教示・ヒントをいただけるとたいへん助かります。よろしくお願いします。 *********************************************** for(i=0; i<MAXCARD; i++){ fgets(buffer,sizeof(buffer),stdin); sscanf(buffer, "%c%d", &alph[i], &score[i]); printf("alph[%d]=%c score[%d]=%d\n", i, alph[i], i, score[i]); }