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

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

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

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

配列

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

Q&A

解決済

3回答

1510閲覧

配列に格納されている値の数を数えたい

dorayaki123

総合スコア4

C

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

配列

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

0グッド

0クリップ

投稿2021/05/30 04:05

編集2021/05/30 04:44

発生している問題

配列に格納されている値の数が正しく表示されない

該当のソースコード

c言語

1#include<stdio.h> 2 3int count1(int a[]){ 4 int i, count = 0; 5 6 for(i = 0; i < 100; i++){ 7 if(a[i] == 0) break; 8 count++; 9 } 10 return count; 11} 12 13int main (void){ 14 int a[10] = {1,2,3,4,5,6,7,8,9,10}; 15 int b[11] = {1,2,3,4,5,6,7,8,9,10,11}; 16 int c[12] = {1,2,3,4,5,6,7,8,9,10,11,12}; 17 printf("%d\n", count1(a)); //11が表示される 18 printf("%d\n", count1(b)); //11が表示される 19 printf("%d\n", count1(c)); //23が表示される 20}

試したこと

配列の最後に0を付け足すとうまくいくことが分かりました。

###設定
配列は要素数が100で、値が格納されてないところには0が格納されているとしています。
コンパイラはgccです。

恐らく0が関係していると思いますが、理由が分からないので
ご教授していただけると幸いです。

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

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

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

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

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

1T2R3M4

2021/05/30 04:13

コンパイル通りませんけど、どうやって実行したんですか。
dorayaki123

2021/05/30 04:44

すみません。これで通ると思います。
guest

回答3

0

他の方々が「ダメである理由」を書いていたくださっているので、「ではどう書けばいいか」の情報を。
具体的にどう書けばいいかに関しては、以下の記事が参考になりそうだと思いました。

https://kaworu.jpn.org/c/%E9%85%8D%E5%88%97%E3%81%AE%E8%A6%81%E7%B4%A0%E6%95%B0%E3%82%92%E8%AA%BF%E3%81%B9%E3%82%8B

投稿2021/05/30 05:00

ninoko

総合スコア9

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

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

dorayaki123

2021/05/30 05:11

ありがとうございます。 参考にさせていただきます。
guest

0

ベストアンサー

配列は要素数が100で、値が格納されてないところには0が格納されているとしています。

そもそもここが間違っています。
値が格納されてないところには、0が格納されているとは限りません。
普通は、次のデータが格納されていることが多いですが、
あなたが使っている gcc は、配列を 16byte 単位で確保するタイプなので、
たまたま空いた部分に 0 のデータがあったものと思われます。
(空いたデータ領域を書き換えるようには決まっていないので 0 になったのはたまたまと思ってください。)
データの数がわかるようにするには、
他にデータの個数を格納する領域が必要です。
C++とからと、vector などで、領域の情報まで含めたデータが渡されるので
そういう型を使ってください。
C++でも、Cレベルでの配列にはそのような機能はありません。

投稿2021/05/30 04:44

編集2021/05/30 04:47
PingHermit

総合スコア478

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

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

dorayaki123

2021/05/30 05:08

わかりました。 ありがとうございます。 基本的なことから勉強し直します。
guest

0

a b c はそれぞれ10要素、11要素、12要素分しか領域を確保していないのに、countではその範囲を超えてアクセスしているので、それはそもそもダメです。
そして、誰も各配列の中に0を入れていないので、配列の範囲を超えて読み込んだ時0が現れるかどうかは運次第です。

投稿2021/05/30 04:11

itagagaki

総合スコア8402

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

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

dorayaki123

2021/05/30 04:57

わかりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問