QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 991|回复: 2

请教:请各位大哥帮我看看,我这段程序是在哪里响应了 ente

[复制链接]
发表于 2006-7-10 14:14:12 | 显示全部楼层 |阅读模式
请教:请各位大哥帮我看看,我这段程序是在哪里响应了 enter 和 CTRL+D 谢谢!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DATASIZE 10

typedef struct stringdata
{
            char *string;
            int iscontinuing;
            struct stringdata *next;
} mydata;

mydata *append(mydata *start, char *input);
void displaydata(mydata *start);
void freedata(mydata *start);

int main(void)
{
            char input[DATASIZE];
            mydata *start=NULL;

            printf("ENTER SOME DATA,AND PRESS Ctrl+D WHEN DONE. \n");

            while(fgets(input, sizeof(input), stdin))
            {
                start=append(start, input);
            }

            displaydata(start);
            freedata(start);
            return 0;
}

mydata *append(mydata *start, char *input)
{
           mydata *cur=start, *prev=NULL, *new;

            while(cur)
            {
                prev=cur;
                cur=cur->next;
            }
            cur=prev;

            new=malloc(sizeof(mydata));
            if(!new)
            {
                printf("COULDN’T ALLOCATE MEMORY! \n");
                exit(255);
            }
   
            if(cur)
                cur->next=new;
            else
                start=new;
   
            cur=new;

        if(!(cur->string=malloc(sizeof(input)+1)))
        {
                    printf("ERROR ALLOCATING MEMORY! \n");
                    exit(255);
        }
        strcpy(cur->string, input);
        cur->iscontinuing=!(input[strlen(input)-1]=='\n'||input[strlen(input)-1]=='\r');
        cur->next=NULL;

        return start;
}


void displaydata(mydata *start)
{
            mydata *cur;
        int linecounter=0, structcounter=0;
        int newline=1;

        cur=start;
        while(cur)
        {
                    if(newline)
                        printf("LINE %d:",++linecounter);
                    structcounter++;
                    printf("%s",cur->string);
                    newline=!cur->iscontinuing;
                    cur=cur->next;
        }
        printf("THIS DATA CONTAINED %d LINES AND WAS STORED IN %d STRUCTS. \n",
        linecounter,structcounter);
}


void freedata(mydata *start)
{
            mydata *cur, *next=NULL;

            cur=start;
            while(cur)
            {
                next=cur->next;
                       free(cur->string);
                free(cur);
                cur=next;
            }
}

//这个程序将终端输入的一系列字符串用链表的形式保存下来。然后将这这些数据组装起来
//回显到终端。链表的节点为 stringdata 结构。stringdata 结构中的整型量 iscontinuing
//用于表示当前节点是否为链表的末尾。如果 iscontinuing 有值,则表示此节点不是链表的
//末尾。



请教:当程序编译运行后
输入:
123 回车
werrt 回车
234d  回车

然后输入
CTRL+D

就显示
123
werrt
234d  


问题1:
我的在这个程序 在哪里响应了enter 这个动作
在哪里响应了 CTRL+D 这个动作


问题2:
cur->iscontinuing=!(input[strlen(input)-1]=='\n'||input[strlen(input)-1]=='\r');

是什么意思?

谢谢!
发表于 2006-7-10 15:08:19 | 显示全部楼层
[code:1]#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DATASIZE 10

typedef struct stringdata
{
char *string;
int iscontinuing;
struct stringdata *next;
} mydata;

mydata *append(mydata *start, char *input);
void displaydata(mydata *start);
void freedata(mydata *start);

int main(void)
{
char input[DATASIZE];
mydata *start=NULL;

printf("ENTER SOME DATA,AND PRESS Ctrl+D WHEN DONE. \n");

while(fgets(input, sizeof(input), stdin))
{
start=append(start, input);
}

displaydata(start);
freedata(start);
return 0;
}

mydata *append(mydata *start, char *input)
{
mydata *cur=start, *prev=NULL, *new;

while(cur)
{
prev=cur;
cur=cur->next;
}
cur=prev;

new=malloc(sizeof(mydata));
if(!new)
{
printf("COULDN’T ALLOCATE MEMORY! \n");
exit(255);
}

if(cur)
cur->next=new;
else
start=new;

cur=new;

if(!(cur->string=malloc(sizeof(input)+1)))
{
printf("ERROR ALLOCATING MEMORY! \n");
exit(255);
}
strcpy(cur->string, input);
cur->iscontinuing=!(input[strlen(input)-1]=='\n'||input[strlen(input)-1]=='\r');
cur->next=NULL;

return start;
}


void displaydata(mydata *start)
{
mydata *cur;
int linecounter=0, structcounter=0;
int newline=1;

cur=start;
while(cur)
{
if(newline)
printf("LINE %d:",++linecounter);
structcounter++;
printf("%s",cur->string);
newline=!cur->iscontinuing;
cur=cur->next;
}
printf("THIS DATA CONTAINED %d LINES AND WAS STORED IN %d STRUCTS. \n",
linecounter,structcounter);
}


void freedata(mydata *start)
{
mydata *cur, *next=NULL;

cur=start;
while(cur)
{
next=cur->next;
free(cur->string);
free(cur);
cur=next;
}
}
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2006-7-10 16:55:16 | 显示全部楼层
谢谢 大大~~
终于把 这点代码看懂了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 12:24 , Processed in 0.049677 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表