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

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

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

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

Q&A

解決済

4回答

266閲覧

c言語/sizeof関数の使い方

Rivia

総合スコア23

C

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

0グッド

0クリップ

投稿2017/08/04 19:36

編集2017/08/04 19:44

###前提・実現したいこと
10回数字を打ってそれを反対から出力させたいです
例)
入力
1
2
3
4
6
7
8
9
10
出力
10
9
8
7
6
5
4
3
2
1イメージ説明
sizeof関数を使うために自分で作った問題なのでsizeofを使って解きたいです。

###発生している問題・エラーメッセージ
出力が
10
10
9
8
7
6
5
4
3
2
1
となってしまいます。

エラーメッセージ

###該当のソースコード

ここにご自身が実行したソースコードを書いてください

#include<stdio.h>

int main(void)
{
int i;
int a[10];

for(i = 0;i < sizeof(a)/sizeof(a[0]);i++) { scanf("%d",&a[i]); } printf("\n\n\n"); for(i=sizeof(a)/sizeof(a[0]);i >= 0;i--) { printf("%d\n",a[i]); } return 0;

}

###試したこと
課題に対してアプローチしたことを記載してください
反対に出力させる所のループの最終値を色々いじってみたのですがダメでした><
###補足情報(言語/FW/ツール等のバージョンなど)

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

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

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

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

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

guest

回答4

0

>二番目のループの初期値がおかしかったようです

はっきり理解できませんか?

2番めのループは10から0まで表示することになっています。
a[10]と定義したらa[0]からa[9]まで定義され、a[10]は存在しません。

投稿2017/08/04 22:11

maiko0318

総合スコア876

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

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

0

単純な添字範囲のミスのようですね。2番目のforループについて、iが配列aの添字範囲内(0〜9)におさまっているかご確認ください。

投稿2017/08/04 20:00

Bongo

総合スコア10807

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

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

Rivia

2017/08/04 20:16 編集

二番目のループででiの初期値が10になっているので入力するときにi=0から始めたので 配列の大きさが11というおかしいことになっているということなのでしょうか
Rivia

2017/08/04 20:19

#include<stdio.h> int main(void) { int i; int a[10]; for(i = 0;i < sizeof(a)/sizeof(a[0]);i++) { scanf("%d",&a[i]); } printf("\n\n\n"); for(i=sizeof(a)/sizeof(a[0])-1;i>0;i--) { printf("%d\n",a[i]); } return 0; } というプログラムに書き直したら正常に動きました!やはり二番目のループの初期値がおかしかったようです
Bongo

2017/08/04 20:33 編集

そうなりますね。配列の要素が10個しかないのに、11番目から値を取り出そうとしていたようです。 GasTさんのアドバイスのように、ループ内でa[i - 1]とするのも一つの手ですが、iの初期値を1減らして配列の末尾、つまり9になるようにする手もあるかと思います。、 for ( i = sizeof(a) / sizeof(a[0]) - 1; i >= 0; i--) { printf("%d\n", a[i]); } [追記] すみません、投稿タイミングの問題で追記コメントを見逃してしまいました。 コメントの通り、初期値を修正すると意図通りになりますね。
Rivia

2017/08/04 20:43

ありがとうございます! 何が悪いか分かったので一安心しました。
guest

0

ベストアンサー

配列の要素の大きさは1オリジンですから、indexで要素を指定するときマイナス1するといいのでは?
動くサンプル

c

1#include<stdio.h> 2 3int main(void) { 4 int i; 5 int a[10]; 6 7 for(i = 0; i < sizeof(a) / sizeof(a[0]); i++) { 8 scanf("%d", &a[i]); 9 } 10 11 for(i = sizeof(a) / sizeof(a[0]); i > 0; i--) { 12 printf("%d\n", a[i - 1]); 13 } 14 return 0; 15}

投稿2017/08/04 19:58

GasT

総合スコア27

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

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

Rivia

2017/08/04 20:12

要素を指定するときマイナス1したら出来ました! ありがとうございました!
guest

0

#include<stdio.h>

int main(void)
{
int i;
int a[10];

for(i = 0;i < sizeof(a)/sizeof(a[0]);i++) { scanf("%d",&a[i]); } printf("\n\n\n"); for(i=sizeof(a)/sizeof(a[0])-1;i>0;i--) { printf("%d\n",a[i]); } return 0;

}
で正常に動きました!二番目のループの初期値がおかしかったようです
回答してくださりありがとうございました。

投稿2017/08/04 20:22

Rivia

総合スコア23

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

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

Bongo

2017/08/04 22:43

おっと、よく見ると修正後のループの条件が、この記述ですと今度はa[0]が抜けてしまいませんか?投稿時のミスでしょうか。
Rivia

2017/08/05 13:52

ホントでした><よく見ると出力が10~2までで1が抜けてました! 二番目のループの終了値をi=>0にすることで正常に動きました(今度こそ) 重ね重ね指摘をありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問