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

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

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

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Q&A

解決済

2回答

997閲覧

atcorder9/4 B問題について

cgen

総合スコア17

C

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

0グッド

0クリップ

投稿2021/09/04 15:08

atcorder9/4B問題についてhttps://atcoder.jp/contests/abc217/tasks/abc217_b
問題文

AtCoder では現在、 ABC , ARC , AGC , AHC の
4 つのコンテストが定期的に開催されています。
AtCoder で現在定期的に開催されているコンテストは
S1​ , S2​ , S3​ とあと1 つは何ですか?

制約
S1​ , S2​ ,
S3​ はそれぞれ、 ABC , ARC , AGC , AHC のいずれかである。
S1​ , S2​ , S3​ は相異なる。

コードを次のように書いたところ、
#include <stdio.h>
#include <string.h>

int main(){
char s1[3], s2[3], s3[3];
scanf("%s", s1);
scanf("%s", s2);
scanf("%s", s3);
if(strcmp(s1, "ABC")!=0 && strcmp(s2, "ABC")!=0 && strcmp(s3, "ABC")!=0) {printf("ABC");}
else if(strcmp(s1, "AGC")!=0 && strcmp(s2, "AGC")!=0 && strcmp(s3, "AGC")!=0) {printf("AGC");}
else if(strcmp(s1, "AHC")!=0 && strcmp(s2, "AHC")!=0 && strcmp(s3, "AHC")!=0) {printf("AHC");}
else{printf("ARC");}
return 0;
}

実行結果が次のようになってしまいました。
$ ./a.exe
AGC
ABC
ARC
ABC

なにがおかしいのか確かめてみるために、コードを次のように改良してs1、s2、s3が見えるようにしました。
#include <stdio.h>
#include <string.h>

int main(){
char s1[3], s2[3], s3[3];
scanf("%s", s1);
scanf("%s", s2);
scanf("%s", s3);
printf("%s\n", s1);
printf("%s\n", s2);
printf("%s\n", s3);
if(strcmp(s1, "ABC")!=0 && strcmp(s2, "ABC")!=0 && strcmp(s3, "ABC")!=0) {printf("ABC");}
else if(strcmp(s1, "AGC")!=0 && strcmp(s2, "AGC")!=0 && strcmp(s3, "AGC")!=0) {printf("AGC");}
else if(strcmp(s1, "AHC")!=0 && strcmp(s2, "AHC")!=0 && strcmp(s3, "AHC")!=0) {printf("AHC");}
else{printf("ARC");}
return 0;
}
そうすると、実行結果が次のようになってしまいました。
$ ./a.exe
AGC
ABC
ARC

ARC
ABC
どこが間違っているのでしょうか。教えてください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

C言語では、文字列の最後には終端を表す文字'\0'をつけなければなりません。
そのため、3文字の文字列を保存するためには、長さ4のchar型の配列が必要です。

c

1char s1[3], s2[3], s3[3];

配列のサイズをすべて4にしましょう。

投稿2021/09/04 15:48

actorbug

総合スコア2224

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

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

cgen

2021/09/04 17:00

できました!!ありがとうございます!! 1つ質問なのですが、char s1[3]とした場合、配列はs1[0]. s1[1], s1[2], s1[3]となり長さ4の配列にはならないのですか?
actorbug

2021/09/04 20:35

なりません。 宣言時に指定する値は、全体の長さであって、添字の最大値ではありません。 char s1[3]; とした場合、配列の要素は s1[0], s1[1], s1[2] までしか存在しません。
cgen

2021/09/06 15:47

そうなんですね!! 勘違いしてました、、 とてもわかりましたありがとうございます!!
guest

0

解決できたようなので別解を考えてみました。
4つの文字の合計値から、入力の 3つの文字を引くと、残りが求めるものです。

C

1#include <stdio.h> // scanf, printf 2 3int main(void) 4{ 5 char s1[4], s2[4], s3[4]; 6 scanf("%s%s%s", s1, s2, s3); 7 printf("A%cC\n", 'B' + 'R' + 'G' + 'H' - s1[1] - s2[1] - s3[1]); 8}

投稿2021/09/07 01:03

編集2021/09/07 01:11
kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問