配列の中身が表示されない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
NightShift
記事: 10
登録日時: 6年前

配列の中身が表示されない

#1

投稿記事 by NightShift » 5年前

大きさ10の整数型配列を用意し、下図のように初期設定しなさい。
この配列を順に調べ、奇数の値のみ、別の大きさ10の整数型配列に代入しなさい。
また、配列の中身と、何個格納したかを画面表示しなさい。

上記の問題を解いていますが、いくら考えても配列の中身が正しく表示されない(-14738741とか
よくわからない数字が表示されます)ので、
どこが間違っているのか教えて頂けるとありがたいです。よろしくお願いします。

コード:

#include <stdio.h>
#include <stdlib.h>  // system

int main(void)
{
	int data1[] = { 10, 15, 22, 45, 9, 66, 71, 4, 37, 82 };
	int* p_data1 = data1;

	int data2[10];
	int* p_data2 = data2;
	int counter = 0;

	for (int i = 0; i < 10; i++)
	{
		if (*p_data1 % 2 == 1)
		{
			*p_data2 = *p_data1;
			counter++;
			p_data2++;
		}
		p_data1++;
	}
	for (int i = 0; i < counter; i++)
	{
		printf("%d ", *p_data2);
		p_data2++;
	}


	printf("\npause");
	system("pause");
	return 0;
}

box
記事: 2002
登録日時: 13年前

Re: 配列の中身が表示されない

#2

投稿記事 by box » 5年前

こんなのじゃダメですか?

コード:

#include <stdio.h>

int main(void)
{
    int data1[] = { 10, 15, 22, 45, 9, 66, 71, 4, 37, 82 };
    int data2[10], counter, i;

    for (counter = i = 0; i < 10; i++) {
        if (data1[i] % 2 == 1) {
            data2[counter++] = data1[i];
        }
    }
    printf("%d odd data\n", counter);
    for (i = 0; i < counter; i++) {
        printf("%d ", data2[i]);
    }
    putchar('\n');
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

かずま

Re: 配列の中身が表示されない

#3

投稿記事 by かずま » 5年前

NightShift さんが書きました:
5年前
上記の問題を解いていますが、いくら考えても配列の中身が正しく表示されない(-14738741とか
よくわからない数字が表示されます)ので、
どこが間違っているのか教えて頂けるとありがたいです。
data1 の中の奇数を data2 にコピーし終わった後、
p_data2 は data2 の途中を指しています。
そこから後は、未初期化なので、何が表示されるかわかりません。

コード:

data2[i] を表示するか、または表示の forループの直前に
p_data2 = data2; を追加してみてください。

NightShift
記事: 10
登録日時: 6年前

Re: 配列の中身が表示されない

#4

投稿記事 by NightShift » 5年前

boxさん、ありがとうございました。
書き忘れてしまいましたが、ポインタを使う指定があるので、
ポインタを使う必要があります。お伝えしてなくてすみません。

かずまさん、大変ありがとうございました。
ご指摘の通り、p_data2 は data2 の途中を指していることに気づいてませんでした。
おかげさまで解決しました。感謝申し上げます。

かずま

Re: 配列の中身が表示されない

#5

投稿記事 by かずま » 5年前

NightShift さんが書きました:
5年前
書き忘れてしまいましたが、ポインタを使う指定があるので、
ポインタを使う必要があります。お伝えしてなくてすみません。
ポインタの学習なら、int i = 0;や int counter = 0; を使わず、
全部ポインタ変数を使うとよいでしょう。

コード:

#include <stdio.h>
#include <stdlib.h>  // system

int main(void)
{
	int data1[] = { 10, 15, 22, 45, 9, 66, 71, 4, 37, 82 };
	int data2[10];
	int *p2 = data2;

	for (int *p1 = data1; p1 < data1 + 10; p1++)
		if (*p1 % 2 == 1) *p2++ = *p1;

	for (int *p = data2; p < p2; p++)
		printf("%d ", *p);

	printf("\npause");
	system("pause");
	return 0;
}

返信

“C言語何でも質問掲示板” へ戻る