アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは<_ _>
自己参照構造体に関する問題を解いています。
入力したデータとは逆順につながったリストを作成するという
問題で、結果はともかく逆順表示に出力できましたが
微妙なところで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));
}

A 回答 (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));
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!