こんにちは<_ _>
自己参照構造体に関する問題を解いています。
入力したデータとは逆順につながったリストを作成するという
問題で、結果はともかく逆順表示に出力できましたが
微妙なところでNGが出ています。
まず、
(1)「Ctrl+z」一回で終了しなければならない
以下のプログラムでは二回Ctrl+zを入力しないと
入力が終了できません。
(2)入力時並列させること
以下のプログラムでは入力時
「name
tell
name
tell
・
・
Ctrl+z」
と入力しなければなりませんが
「name tell
name tell」
という風に入力しなければなりません・・・
(3)変数を変化、増減させてはならない
並列させるために変数増やそうと思ったら
bufferだけでやらなければならないみたいです・・・
三時間ぐらい調べて悩みましたがうまくいきませんでした
どうしたら以上のようにできるのかご指導、ご鞭撻のほどを
どうかよろしくお願いします<_ _>
#include<stdio.h>
#include<malloc.h>
struct tfield{
char name[20];
char tel[20];
struct tfield *pointer;
};
struct tfield *talloc(void);
int main(void)
{
struct tfield *head,*p;
char buffer[BUFSIZ];
head=NULL;
while(1){
p=talloc();
if( p == NULL ){
printf( "メモリを確保できません。\n" );
_exit( 0 );
}
if(scanf("%s",&buffer)==EOF){
break;
strcpy(p->name, buffer);
}
buffer=0;
if(scanf("%s",&buffer)==EOF){
break;
strcpy(p->tel, buffer);
}
p->pointer = head;
head = p;
}
if(head != NULL){
p=head;
while(p!=NULL){
printf("%6s %s\n",p->name,p->tel);
p=p->pointer;
}
}
return 0;
}
struct tfield *talloc(void) /*記憶領域の取得*/
{
return (struct tfield *)malloc(sizeof(struct tfield));
}
No.1ベストアンサー
- 回答日時:
先ほど回答しようとしたところ締め切られていたのでここで改めて。
データを1行で入力しなければならない縛りが解けたみたいですね。
#include<stdio.h>
#include<malloc.h>
#include <unistd.h>
#include <string.h>
struct tfield{
char name[20];
char tel[20];
struct tfield *pointer;
};
struct tfield *talloc(void);
int main(void)
{
struct tfield *head,*p;
char buffer[BUFSIZ];
head=NULL;
while(1){
p=talloc();
if( p == NULL ){
printf( "メモリを確保できません。\n" );
_exit( 0 );
}
printf( "name? " );
if( scanf( "%s", buffer ) == EOF ){
/* Ctrl+zだとscanfはEOFを返すので、このルートを通りループを抜ける */
/* 質問者はここで構造体へデータをいれようとしていますが、それはダメ */
free( p ); /* 使わないのでメモリを開放 */
break;
}
strcpy(p->name, buffer);
printf( "tel? " );
if( scanf( "%s", buffer ) == EOF ){
/* nameと同じ */
free( p );
break;
}
strcpy(p->tel, buffer );
p->pointer = head;
head = p;
}
printf( "\n" );
if( head != NULL ){
p=head;
while( p != NULL ){
printf("%6s %s\n",p->name,p->tel);
p=p->pointer;
}
/* 確保したメモリはきちんと開放する */
do{
p = head->pointer;
free( head );
head = p;
} while( head != NULL );
}
return 0;
}
struct tfield *talloc(void) /*記憶領域の取得*/
{
return (struct tfield *)malloc(sizeof(struct tfield));
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
受信データから必要な部分のみ...
-
C言語でファイルから複素数の値...
-
C言語のプログラムで、途中で止...
-
C言語で複数列のデータを1列の...
-
なぜ無限ループになるかが分か...
-
矢印キーを押下してコンソール...
-
構造体メンバの初期化
-
セグメンテーションエラーの原...
-
空白を含んだ文字列がうまく格...
-
fwrite処理について
-
printf による16進表示について
-
【C言語】全角文字の配列を、全...
-
信頼区間の1.96や1.65ってどこ...
-
「Aに対するBの割合」と「Aに対...
-
C言語 プログラム
-
プログラムの実行時に'<'でリダ...
-
DWORDの実際の型は何でしょうか
-
C++にてtemplateで受け取った任...
-
プログラムでの数字につく”f”の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
C言語で複数列のデータを1列の...
-
printf による16進表示について
-
C言語のプログラムで、途中で止...
-
char型2つを結合し、short型に...
-
矢印キーを押下してコンソール...
-
#defineが使用するメモリ領域に...
-
【C言語】全角文字の配列を、全...
-
終了条件Ctrl+zについて,結果表...
-
空白を含んだ文字列がうまく格...
-
プログラミングの授業の課題です
-
リストの作成と出力(C言語)
-
c言語で文書を読み込み、単語の...
-
構造体メンバの初期化
-
エラーについて質問です。
-
reallocでエラー
-
C言語でのCSVファイルの読み出...
-
なぜ無限ループになるかが分か...
-
Cプログラムについて
-
C++で指定文字列のカウント方法...
おすすめ情報