• 締切済み

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; } }

みんなの回答

回答No.2

文字配列strを用意して、そこに、いったん、%sの変換で英字とそれに区切りなしで続く数字列を読み取ってから、それをsscanfで英字と数値に切り分けるということでしょう。 char str[10], alpha; int num; scanf("%s",str); sscanf(str,"%c%s",&alpha,&num);

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

>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); のようにすればよいのではないでしょうか。

matpac75
質問者

補足

迅速な回答をありがとうございます!! さっそく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]); }

関連するQ&A

  • 構造体と配列の関係

    #include<stdio.h> typedef struct stat { char alph; int count; }Stat; int main(void) { Stat al[26]; al.alphにアルファベットaからzを、al.countを全て0とし、各アルファベットに対するカウントを取れるようにしたいのですが、どのように書けば良いでしょうか?

  • 構造体の配列 char *' 型は 'char' 型に変換できない

    大学の課題で構造体の配列の課題が出て、自分で考えてはみたもののわからないところが出たので質問させていただきます。 内容 人物の名前と年齢を入力し、表示するプログラム。 1、typedefを用いて、その構造体にpersonという名前をつける 2、main()にて以下の処理を行う。 (a)person型のサイズNの配列を用意する。 (b)N人分の名前と年齢入力して(a)で用意した配列に格納する。 (c)N人分入力後、名前と年齢を画面に表示する。 #include <stdio.h> #define ninzu 1 typedef struct{ char name[ninzu][20]; int age[ninzu]; } person; int main(void){ int i,ag[ninzu]; char nam[ninzu][20]; for(i=0;i<ninzu;i++){ printf("名前を入力\n"); scanf("%s\n",nam[i]); printf("年齢を入力\n"); scanf("%d\n",&ag[i]); } for(i=0;i<ninzu;i++){ person pro={nam[i],ag[i]}; printf("%s\n",pro.name[i]); printf("%d\n",pro.age[i]); } return(0); } 現在、↑のところまでいったのですが、 for(i=0;i<ninzu;i++){ person pro={nam[i],ag[i]}; printf("%s\n",pro.name[i]); printf("%d\n",pro.age[i]); } の部分の配列の表示の仕方がいまいちわかりません。 現在" 'char *' 型は 'char' 型に変換できない(関数 main() "のエラーが出ています。 わかり難いかもしれませんが、ご指導のほう宜しくお願いいたします。

  • char型からint型への変換

    char型からint型への変換 char a[6]=3+2-5; int e[6]; (全て0で初期化済) for(i=0;i<6;i++){ if(c[i]=='0'||c[i]=='1'||c[i]=='2'||c[i]=='3'||c[i]=='4'||c[i]=='5'){ e[i]=((int)c[i]-'0'); printf("%d",e[i]); }} for(i=0;i<NUM_DATA;i++){ printf("%d",e[i]); } このプログラムでは上のe[]の出力では「325」と出力されますが、 下のe[]の出力ではめちゃくちゃな数字が出力されてしまいます。 きちんと数字だけを抽出しint型に変換するにはどうしたらいいでしょうか? C言語で行っています。よろしくお願いします。

  • 配列の中を変更

    入力したnameに、入力したageの数だけ文字を進める(例えばnameがOda、ageが12→表示結果がAmp)にする関数を作成しようとしたのですが、やり方がまったくわかりません。 そもそもこのような場合、文字1つ1つに別の配列を使わなければならないのでしょうか? #include <stdio.h> #define N 1 #define NAME 20 typedef struct{ char name[NAME]; char age; } person; int main(void){ int i; person persons[N]; for(i=0;i<N;i++){ printf("name > "); scanf("%s" , persons[i].name); printf("age > "); scanf("%d" , &persons[i].age); } for(i=0;i<N;i++){ printf("name = %s\n" , persons[i].name); printf("age = %d\n" , persons[i].age); } return 0; }

  • プログラムの雛型

    学校でプログラミングをやっているのですが、全くわからず行き詰まってしまいました。 /*   文   */のところがわかりません。 どなたかわかる方いらっしゃいましたらご指導のほどよろしくおねがいします。 #include <stdio.h> #define SIZE 1024 #define ALPH 26 /* alphabet: 26 */ #define CH 36 /* alphabet: 26 + number:10 */ main() { char line[SIZE], c; int i, j; int num[CH]; /* 文字の使用回数 */ int ch[CH]; /* 使用回数の多い文字順の情報 */ int max, tmp; /* 初期化 */ for (i = 0; i < CH; i++) { /* 配列 num, ch の初期化 */ } /* 一行ずつ読み込み、一行ずつ処理 */ while(fgets(line, SIZE, stdin) != NULL) { for (i = 0; line[i] != '\0'; i++) { c = line[i]; /* if 文 */ } } /* 使用回数の多い文字の順番を調べる */ for (i = 0; i < CH-1; i++) { max = i; /* for 文と if 文と値の交換部分 */ } /* 出力部分 */ for (i = 0; i < CH; i++) { if (i < ALPH) /* printf 文 */ else /* printf 文 */ if (ch[i] < ALPH) /* printf 文 */ else /* printf 文 */ } }

  • 構造体について

    5件のデータをRECORDに追加したいのですが、 RECORD inputdata(void)の宣言文エラーなどのコンパイルエラー。それと、inputdataを用いてどうやって5件のデータを入れたらいいかがわかりません。教えてください。 #define SIZE 5 #include <stdio.h> typedef struct{ int yy; int mm; int dd; }YMD; typedef struct{ char name[20]; YMD birthday; int age; }RECORD; RECORD inputdata(void); void main(void) { int i; for(i = 0;i < SIZE;i++){ inputdata(); } RECORD inputdata(void) { RECORD person; printf("名前>"); scanf("%s", person.name); printf("誕生日入力\n"); printf("年>"); scanf("%d", person.birthday.yy); printf("月>"); scanf("%d", person.birthday.mm); printf("日>"); scanf("%d", person.birthday.dd); return person; }

  • ポインタの扱い

    すみません、構造体へのポインタの配列の扱いに困っています。 下記ソースの struct list *hashtable[HASHSIZE]; の箇所をmain部に入れた場合の処理がうまくいきません。。 どのように修正すれば良いのでしょうか。 申し訳ありませんが教えてください。 --------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> #define HASHSIZE 40 #define MAX_KW_LEN 256 #define NUM_KW 23 #define TRUE 1 #define FALSE 0 struct list { char keyword[MAX_KW_LEN]; struct list *next; }; struct list *hashtable[HASHSIZE]; static char kw[NUM_KW][MAX_KW_LEN] = { "auto", "break", "double", "enum", "char", "continue", "extern", "float", "for", "int", "long", "register", "short", "signed", "static", "struct", "typedef", "union", "unsigned", "return", "void", "volatile", "while" }; int Hash(char *key); void InitHTable(void); int FindKeyWord(char *key); void ListKeyWord(void); void FreeKeyWord(void); int main(void); int Hash(char *key) { int hashval = 0; while (*key != '\0') hashval += *key++; return (hashval % HASHSIZE); } void InitHTable(void) { int i; struct list *p, *q; int hashval; for (i = 0; i < NUM_KW; i++) { printf("%d\n",i); if ((FindKeyWord(kw[i])) == FALSE) { if ((p = (struct list *)malloc(sizeof(struct list))) == NULL) { fprintf(stderr, "メモリ不足です。\n"); exit(2); } strcpy((*p).keyword, kw[i]); hashval = Hash(kw[i]); if (hashtable[hashval] == NULL) { hashtable[hashval] = p; p->next = NULL; } else { q = hashtable[hashval]; while (q->next != NULL) { q = q->next; } q->next = p; p->next = NULL; } } } } int FindKeyWord(char *key) { struct list *p; for (p = hashtable[Hash(key)]; p != NULL; p = p->next) if (!strcmp(key, (*p).keyword)) return (TRUE); return (FALSE); } void ListKeyWord(void) { int i; struct list *p; for (i = 0; i < HASHSIZE; i++) for (p = hashtable[i]; p != NULL; p = p->next) printf("予約語:%s ハッシュ値:%d:\n", (*p).keyword, Hash((*p).keyword)); } void FreeKeyWord(void) { int i; struct list *p, *q; for (i = 0; i < HASHSIZE; i++) for (p = hashtable[i]; p != NULL; ) { q = p->next; free(p); p = q; } } int main(void) { char word[MAX_KW_LEN]; int i; InitHTable( ); ListKeyWord( ); for (i = 0; i < 4; i++) { printf("Cの予約語を入力して下さい "); fgets(word, 128, stdin); if ((FindKeyWord(word)) == TRUE) printf("%s は登録済みです。\n", word); else printf("%s は未登録です。\n", word); } FreeKeyWord( ); }

  • int型の表せる範囲

    VC++6.0 on win2kです。 int型の表せる範囲は3万ぐらいまでだと思っていたのですが、 #include <stdio.h> #define Max 1000000 void main(){ for(int i=0;i<Max;i++){ printf("%d\n",i); } } というプログラムを走らせると普通に出ます。 int型の範囲とは何を意味するのでしょうか?

  • int_table[]={}中身についての質問

    こんにちは、いつもお世話になっています。 今、int_table[]={} の中身をソートさせるプログラムを作っています。 そこで質問なのですが・・・例えば、 int_table[]={1,54,23} などでは、ソートすることが出来たのですが。 この中身を数字で入力する({1,54,23}のように)のではなく、 下記のように、0~100までのランダムな数字を10個入力させるようなことは出来るのでしょうか? for(i=0;i<10;i++)) printf("%d\n",GetRandom(0,100)) (このような中身をint_table[]の中へ入れることは可能なのでしょうか?。) よろしくお願いいたします。

  • 構造体内のchar配列が期待どうりprintfされない。

    typedef struct TestClass_Cat{ char name[10]; int age; }Cat; として、 int main(void){ Cat cat1; cat1.name[10] = "mike"; printf("%s", cat1.name); } として、実行すると、コンソールには フフフフフフフフフフTフ pBPress any key to continue と表示されます。 1.なぜ、mikePress any key to continue と表示されないのでしょうか?

専門家に質問してみよう