| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1516 人关注过本帖
标题:缓冲流问题,输入一个数后,下一个不能再读取(printf,scanf的问题)
只看楼主 加入收藏
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
 问题点数:0 回复次数:13 
缓冲流问题,输入一个数后,下一个不能再读取(printf,scanf的问题)

具体看红色的部分:
#include<stdio.h>
#include<malloc.h>
// #define NULL 0
typedef struct link{
int data;
struct link *next;
} * LinkList;

#define LEN sizeof(LinkList)
int n;
LinkList creatlink(int h)
{
LinkList head;
LinkList p1,p2;
int j=0;
n=0;

p1=p2=(LinkList)malloc(LEN);
head=NULL;
while(j<h)
{
if(n==0)
{head=p1;
printf("input p1->data:\n");
scanf("%d",&p1->data);


}
else
{ p2=p1;

p1=(LinkList)malloc(LEN);

p2->next=p1;
printf("input the data:");
scanf("%d",&p1->data);
}
j++;
n++;
}
p1->next=NULL;
return(head);
}
void print(LinkList head )
{
LinkList p;
printf("Now ,These %d recods are:\n",n);
p=head;

do
{
printf("%d\n",p->data);
p=p->next;
}
while (p!=NULL);
}
LinkList insert(LinkList head,int i)
{
int j;
LinkList p0,p1,p2;
p1=head ;
p0=(LinkList)malloc(LEN);
printf("input the input data:");
scanf("%f",&p0->data);

if(head==NULL)
{
head=p0;
p0->next=NULL;

}
else if(i==1)
{
head=p0;
p0->next=p1;
}
else
if(i)
{
while(p1->next!=NULL&&j<i)
{
p2=p1;
p1=p1->next;
j++;
}
p2->next=p0;
p0->next=p1;


}
else
{
p1->next=p0;p0->next=NULL;
}
n=n+1;
return(head);
}
LinkList dellink(LinkList head,int i)
{
int j=1;
LinkList p1,p2;
if(head==NULL)
{
printf("\n list null!\n");
return(head);
}
p1=head;
while(j<i&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
j++;
}
if(i==1)
head=p1->next;
else if(i)
{
p2->next=p1->next;
n--;
}
else printf("%ld not be found!\n",i);

return(head);
}
void main()
{
LinkList creatlink(int h);
void print(LinkList head);
LinkList insert(LinkList head,int i);
LinkList dellink(LinkList head,int i);
LinkList head;
int i,p;
char a;
printf("Input how much nodes do you want to enter in ?\n");
scanf("%d",&p);
head = creatlink(p);
print(head);
printf(" 2 . which one do you want to delete or input :\n");
scanf("%d",&i);
printf(" 1 . The link have been created,you can instrt and delete link,input 'i' or 'd'\n");

scanf("%c",&a);

// 多个scanf语句先后出现时,避免使用%c格式输
// 此处,a 实际得到的值 是上一个scanf语句输入时的回车
// 建议 将 a 定义成 int 类型字符输入回车时候,缓冲流中是不留回车的,而其他输入完毕后缓冲流中还回有回车的.字符输入完毕不 //是回车时以后输入回车时候,如果遇到其他类型的时候.前边的回车符号就全部清空了
if(a=='i'||a=='I')
head=insert(head,i);
else if(a=='d'||a=='D')
head=dellink(head,i);
print(head);
}
运行图片如下:

搜索更多相关主题的帖子: printf scanf 缓冲 输入 
2007-09-20 23:35
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册


方寸之内,剖天下; 方坛之内,析自我;
2007-09-20 23:35
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
得分:0 
// 多个scanf语句先后出现时,避免使用%c格式此处,a 实际得到的值 是上一个scanf语句输入时的回车将 a 定义成 int 类型字符输入回车时候,缓冲流中是不留回车的,而其他输入完毕后缓冲流中还回有回车的.字符输入完毕不是回车时以后输入回车时候,如果遇到其他类型的时候.前边的回车符号就全部清空了!
这是我从网上的到的一个结论,但是不能得到实现

方寸之内,剖天下; 方坛之内,析自我;
2007-09-20 23:39
jinxin3256
Rank: 1
等 级:新手上路
帖 子:196
专家分:0
注 册:2007-9-7
收藏
得分:0 
printf("Input how much nodes do you want to enter in ?\n");
scanf("%d",&p);
head = creatlink(p);
print(head);
printf(" 2 . which one do you want to delete or input :\n");
scanf("%d",&i);
printf(" 1 . The link have been created,you can instrt and delete link,input 'i' or 'd'\n");

scanf("%c",&a); 你是不是说这一句会得到回车符,而无法输入?
改成 scanf("%*c%c",&a); 试试。

代替leisure1980广告下: 群号45146331
2007-09-21 09:57
felicia
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-9-21
收藏
得分:0 
以下是引用jinxin3256在2007-9-21 9:57:56的发言:
printf("Input how much nodes do you want to enter in ?\n");
scanf("%d",&p);
head = creatlink(p);
print(head);
printf(" 2 . which one do you want to delete or input :\n");
scanf("%d",&i);
printf(" 1 . The link have been created,you can instrt and delete link,input 'i' or 'd'\n");

scanf("%c",&a); 你是不是说这一句会得到回车符,而无法输入?
改成 scanf("%*c%c",&a); 试试。

应该改成scanf(" %c",&a);


2007-09-21 09:58
jinxin3256
Rank: 1
等 级:新手上路
帖 子:196
专家分:0
注 册:2007-9-7
收藏
得分:0 

收回,并对楼上表示歉意

[此贴子已经被作者于2007-9-21 18:42:08编辑过]


代替leisure1980广告下: 群号45146331
2007-09-21 10:32
felicia
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-9-21
收藏
得分:0 
以下是引用jinxin3256在2007-9-21 10:32:54的发言:

楼上的,你所说的无法运行。请测试了再来,不要想当然的认为。

认为什么?谁说了无法运行?你回错帖子了吧,发帖子请你看清楚


2007-09-21 12:28
白年不亮
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2007-9-17
收藏
得分:0 
以下是引用jinxin3256在2007-9-21 10:32:54的发言:

楼上的,你所说的无法运行。请测试了再来,不要想当然的认为。。


scanf的控制字符串中加空格可以过滤掉空白字符(如回车,制表)

scanf(" %c",&a); %c前的空格可以过滤掉上次敲回车后留下的'\n',从第一个非空白字符开始读。

建议看《c primer plus》第八章 字符输入/输出和输入确认


[glow=255,red,2] 天凉了,穿上马甲暖和多了。[/glow]
2007-09-21 12:34
jinxin3256
Rank: 1
等 级:新手上路
帖 子:196
专家分:0
注 册:2007-9-7
收藏
得分:0 

学习了。。。。。


代替leisure1980广告下: 群号45146331
2007-09-21 12:55
felicia
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-9-21
收藏
得分:0 
最讨厌那些自己没运行过却反问别人有没有运行的人,不过偶碰到也不是一次两次

2007-09-21 15:40
快速回复:缓冲流问题,输入一个数后,下一个不能再读取(printf,scanf的问题)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020805 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved