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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

3回答

934閲覧

配列、atcoder9/11B問題について

cgen

総合スコア17

C

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/09/12 15:28

編集2021/09/12 15:35

前提・実現したいこと

atcoder9/11B問題で自分の実行環境ではできたのですが、ACになりません。atcoderの提出では次のようなエラーメッセージがでてしまいました。
https://atcoder.jp/contests/abc218/tasks/abc218_b
問題文
1 以上 26 以下の整数からなる長さ 26 の数列 P=(P1​,P2​,…,P26​) が与えられます。ここで、P の要素は相異なることが保証されます。
以下の条件を満たす長さ26 の文字列S を出力してください。
任意の i(1≤i≤26) について、S の i 文字目は辞書順で小さい方からPi​ 番目の英小文字である。
制約
1≤Pi​≤26
Pi​!=Pj​
(i!=j)
入力は全て整数である。

入力
入力は以下の形式で標準入力から与えられる。
P1​ P2​ … P26​
出力
文字列S を出力せよ。
入力例 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
出力例 1
abcdefghijklmnopqrstuvwxyz
入力例 2
2 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
出力例 2
bacdefghijklmnopqrstuvwxyz
入力例 3
5 11 12 16 25 17 18 1 7 10 4 23 20 3 2 24 26 19 14 9 6 22 8 13 15 21
出力例 3
eklpyqragjdwtcbxzsnifvhmou

発生している問題・エラーメッセージ

./Main.c: In function ‘main’: ./Main.c:7:9: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] 7 | scanf("%d", &p[i]);

該当のソースコード

#include <stdio.h> int main(){ int p[26], i; char s[27]; for(i=0;i<26;i++){ scanf("%d", &p[i]); } char zisyo[27]="abcdefghijklmnopqrstuvwxyz"; for(i=0;i<26;i++){ s[i]=zisyo[p[i]-1]; } printf("%s\n", s); return 0; }

###実行結果

oamke@DESKTOP-3PLG0UV ~/kyopuro/20210911 $ gcc b.c oamke@DESKTOP-3PLG0UV ~/kyopuro/2021091 $ ./a.exe 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 abcdefghijklmnopqrstuvwxyz oamke@DESKTOP-3PLG0UV ~/kyopuro/20210911 $ ./a.exe 2 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 bacdefghijklmnopqrstuvwxyz oamke@DESKTOP-3PLG0UV ~/kyopuro/20210911 $ ./a.exe 5 11 12 16 25 17 18 1 7 10 4 23 20 3 2 24 26 19 14 9 6 22 8 13 15 21 eklpyqragjdwtcbxzsnifvhmou

コード作成の際の疑問

一般的には、終端文字も含めた配列の長さを宣言すると思うのですが、intの場合は終端文字は考えなくてもいいのでしょうか。今回はp[26]としてできました。また配列に値を入れていく際にfor文だと終端文字は入れられないと思うのですが、気にしなくてもよいのでしょうか。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

C

1#include <stdio.h> 2 3int main(){ 4 const char dic[]="_abcdefghijklmnopqrstuvwxyz"; 5 int i, c; 6 for(i=0; i<26; i++){ 7 if(scanf("%d", &c) > 0 && c >= 1 && c <= 26){ 8 putchar(dic[c]); 9 } 10 } 11 putchar('\n'); 12}

まず、前提として、英語で書かれているエラーメッセージの内容を読んでください。要約すると、scanf関数の使い方に問題がある、という内容が書いてあります。次に、関数の使い方が問題となっているので、関数の仕様を調べます。scanf関数の場合、読み込めた入力数を返します。整数1個を読み込もうとした場合に想定される返り値は、1(成功)、0(失敗:数字として読み込めない文字が先頭に来ている)、マイナス値(エラー:EOFなど)、のいずれかです。
(そして、最近のコンパイラでは、この返り値を無視することを禁止している場合があります。)

つまり、返り値を使って、正しく読み込めたか確認してください、というのがエラーの概要です。

投稿2021/09/12 21:55

majiponi

総合スコア1722

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

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

0

./Main.c:7:9: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]

これはエラーメッセージではありません。エラーメッセージなら、error: と
表示されるところが warning: となっていますから、警告メッセージです。
文法上問題ないが、意図しない動作をする可能性があるという警告です。

また配列に値を入れていく際にfor文だと終端文字は入れられないと思うのですが、気にしなくてもよいのでしょうか。

気にしてください。s[26] = '\0'; が必要です。
質問のコードをそのまま私の環境で実行すると、
abcdefghijklmnopqrstuvwxyzn2 と表示されました。

printf("%.26s\n", s); とすれば、終端の '\0' は不要です。

整数ひとつずつを文字に変換すれば、配列を使わずにできます。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int n = 26, i; 6 while (n-- && scanf("%d", &i) == 1) putchar('a' - 1 + i); 7 putchar('\n'); 8}

私たちが通常使用している文字コードでは 'a'から'z'まで連続しているので
このコードで動きますが、'a'から'z'までが連続していない文字コード(例えば
EBCDIC)の場合は、次のようにしないとダメでしょう。
putchar(".abcdefghijklmnopqrstuvwxyz"[i]);

投稿2021/09/13 05:03

kazuma-s

総合スコア8224

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

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

0

intの場合は終端文字は考えなくてもいいのでしょうか。

文字列ではないのだから、むしろ考えてはいけません。26要素なら26です。

また配列に値を入れていく際にfor文だと終端文字は入れられないと思うのですが、気にしなくてもよいのでしょうか。

char列を文字として扱うつもりなら、文字列は'\0'で終端するのが決まりです。
for-loopが終わったところで s[i] = '\0'; が必要です。

投稿2021/09/12 16:50

episteme

総合スコア16612

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問