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

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

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

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

Q&A

解決済

2回答

660閲覧

C言語の勉強のため問題を解いていますがエラーの理由がわからない

yuruyuru

総合スコア14

C

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

0グッド

0クリップ

投稿2021/02/17 06:59

編集2021/02/17 07:05

###問題
太郎が花子と一緒にトランプ遊びをしようとしたところ、52枚あるはずのカードが n 枚のカードしか手元にありません。これらの n 枚のカードを入力として、足りないカードを出力するプログラムを作成して下さい。

太郎が最初に持っていたトランプはジョーカーを除く52枚のカードです。

52枚のカードは、スペード、ハート、クラブ、ダイヤの4つの絵柄に分かれており、各絵柄には13のランクがあります。

最初の行に太郎が持っているカードの枚数 n (n ≤ 52)が与えられます。

続いて n 組のカードがそれぞれ1行に与えられます。各組は1つの空白で区切られた文字と整数です。文字はカードの絵柄を表し、スペードが'S'、ハートが'H'、クラブが'C'、ダイヤが'D'で表されています。整数はそのカードのランク(1 〜 13)を表しています。

URL:
https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/6/ITP1_6_B

C言語

1#include <stdio.h> 2#include <string.h> 3 4int main (void) { 5int number, i, j, n; 6int cards[4][14]; 7char picture; 8 9for (j=0;j<=3;j++) { 10for (i=0;i<=13;i++) { 11if (j==0 && i==0) { 12cards[j][i]='S'; 13} else if (j==1 && i==0) { 14cards[j][i]='H'; 15} else if (j==2 && i==0) { 16cards[j][i]='C'; 17} else if (j==3 && i==0) { 18cards[j][i]='D'; 19} 20cards[j][i]=i; 21} 22} 23 24scanf ("%d",&n); 25 26for (i=1;i<=n;i++) { 27scanf ("%c %d",&picture,&number); 28if (picture=='S') { 29picture=0; 30} else if (picture=='H') { 31picture=1; 32} else if (picture=='C') { 33picture=2; 34} else if (picture=='D') { 35picture=3; 36} 37cards[picture][number]=0; 38} 39 40for (j=0;j<=3;j++) { 41for (i=0;i<=13;i++) { 42if (cards[j][i]!=0) { 43if (j==0) { 44printf ("S %d",i); 45} else if (j==1) { 46printf ("H %d",i); 47} else if (j==2) { 48printf ("C %d",i); 49} else if (j==3) { 50printf ("D %d",i); 51} 52} 53 54} 55} 56 57return 0; 58}

###自分のコードの意味
まずcards[][]でSの1〜13、Hの1〜13、Cの1〜13、Dの1〜13の表のようなものを作ります。
次にscanfしたもののところに0を代入します。
そして0が代入されていないところを見つけてそこを出力します。

###エラー内容
zsh: bus error
と言うエラーが
S 12
などのように入力しているときに出ます

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

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

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

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

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

guest

回答2

0

ベストアンサー

おそらくですが、scanf%cが、前の入力の末尾に残った改行文字を取り込んでしまっている状況ではないでしょうか?改行文字の文字コードは10なので、cards[picture]のようにすれば配列の領域を突破してしまいます。

scanfを直接操るのは煩雑なので、「fgetsで1行取得」→「sscanfでパターン認識」という2段階に分けたほうがいいでしょう。

投稿2021/02/17 07:28

maisumakun

総合スコア146018

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

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

yuruyuru

2021/02/17 08:05

maisumakunさん ありがとうございます。 無事正常に動きました!
guest

0

diff

1- scanf ("%c %d",&picture,&number); 2+ scanf (" %c%d",&picture,&number);

%c の前にスペースを置くだけで解決するでしょう。

質問とは無関係ですが、
最初の for の2重ループで cards[j][i] に 'S' や 'H' などを
代入した後で i を上書きしているので、'S' などは入りません。

投稿2021/02/17 10:56

kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問