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

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

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

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

Q&A

解決済

2回答

880閲覧

構造体、ポインタ、スタック

rig

総合スコア13

C

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

0グッド

0クリップ

投稿2018/12/05 11:35

編集2018/12/05 12:18

入力例~

人数:3
学籍番号:123
名前:佐藤
学籍番号:456
名前:田中
学籍番号:789
名前:前田

出力例~

学籍番号:789
名前:前田
学籍番号:456
名前:田中
学籍番号:123
名前:佐藤

というような新しく入力されたデータ順に出力するプログラムを作りたいのですが、下のプログラムを実行すると

学籍番号:789
名前:前田
学籍番号:789
名前:前田
学籍番号:789
名前:前田

と出力されてしまいます。最初に述べたように出力できるようどこが間違えていてどうしたら希望通り出力できるのか教えてください。

ソースコード~
#include<stdio.h>
#include<stdlib.h>
#define STACKSIZE 100

typedef struct personaldata {

char *stnum, *name;

}PD;

PD data[STACKSIZE];
int sp = -1;

int push(char *a, char *b)
{
if (sp >= STACKSIZE - 1)
return -1;

sp++; data[sp].stnum = a; data[sp].name = b; return 0;

}

int pop(char *a, char *b) {
if (sp < 0)
return -1;

printf("\n%d\n", sp); a = data[sp].stnum; b = data[sp].name; sp--; printf("学籍番号:%s\n名前:%s\n", a, b); return 0;

}

int main(void) {

int i, n; char a[STACKSIZE], b[STACKSIZE]; PD *data; printf("人数:"); scanf("%d", &n); data = (PD *)calloc(n, sizeof(PD *)); for (i = 0; i < n; i++) { printf("学籍番号:"); scanf("%s", a); printf("名前:"); scanf("%s", b); push(a, b); } for (i = 0; i < n; i++) pop(a, b); return 0;

}

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

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

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

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

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

episteme

2018/12/05 11:44

「というようなプログラム」ってなによ。学籍番号の大きい順かい? 説明せよ。
rig

2018/12/05 11:53

情報不足すみません。スタックを用いたいので入力されたのが新しい順です。
guest

回答2

0

ベストアンサー

C

1int push(char *a, char *b) 2{ 3 if (sp >= STACKSIZE - 1) 4 return -1; 5 sp++; 6 data[sp].stnum = a; 7 data[sp].name = b; 8 9 return 0; 10}

ここでdata[sp].stnumaのアドレス、data[sp].namebのアドレスをコピーしてるためです。
(文字列のコピーをしてないためです)

投稿2018/12/05 11:45

rururu3

総合スコア5545

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

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

rig

2018/12/05 12:16

回答ありがとうございます。では、この場合どう改善すればよいのですか 聞いてばかりですみません
guest

0

for (i = 0; i < n; i++)

{
printf("学籍番号:");
scanf("%s", a);
printf("名前:");
scanf("%s", b);
push(a, b);
}

このa,b のアドレスはずっと同一と言うのは理解できるでしょうか。
このループ内でずっと同じ場所の配列に上書きするだけで、pushしているアドレスは全て同一となります

あとでプリントしてもすべて同じになるのはこのせいです

投稿2018/12/05 11:42

y_waiwai

総合スコア87774

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

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

rig

2018/12/05 12:35

回答ありがとうございます。すみませんが、どう変えれば希望通りの実行結果になるかを具体的に教えていただけると助かります。わがままをすみません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問