| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 471 人关注过本帖
标题:错在哪里?
只看楼主 加入收藏
起名真难
Rank: 1
来 自:广东广州
等 级:新手上路
帖 子:19
专家分:3
注 册:2011-3-31
结帖率:80%
收藏
已结贴  问题点数:15 回复次数:5 
错在哪里?
题目:
#include<stdio.h>
图片附件: 游客没有浏览图片的权限,请 登录注册

#include<conio.h>
#include<malloc.h>
void main()
{
 char * match(char *s,char ch);
 char *p,*p1;
 char c;
 int n;
 printf("input a number you want to use space :");
 scanf("%d",&n);
 printf("\n");
 p=(char *)malloc(n);
 printf("input a chararray that you want to:");
 scanf("%s",p);
 printf("\n");
 printf("input a char you want to fine:");
 scanf("%c",&c);     //就在这里把scanf给跳过了,c的值输入不了,什么原因呢?
printf("\n");
 p1=match(p,c);
 printf("the new chararray is:");
 printf("%s",p1);
 printf("\n");
 free((void *)p);
 getch();
}
 char * match(char *s,char ch)
 {
  int i=0;
  while(s[i]!='\0')
  {
   if(s[i]==ch)
    break;
   i++;
  }
   return(s+i);
 }
搜索更多相关主题的帖子: include number 
2011-04-12 18:08
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:8 
//就在这里把scanf给跳过了,c的值输入不了,什么原因呢?

scanf(" %c",&c);加个空格  把上次输入的空白字符回车给忽略掉     
收到的鲜花
  • 起名真难2011-04-12 22:29 送鲜花  1朵   附言:我很赞同
  • 起名真难2011-04-12 22:29 送鲜花  3朵   附言:我很赞同

                                         
===========深入<----------------->浅出============
2011-04-12 18:14
起名真难
Rank: 1
来 自:广东广州
等 级:新手上路
帖 子:19
专家分:3
注 册:2011-3-31
收藏
得分:0 
回复 2楼 laoyang103
内牛满面~终于解决掉了~非常感谢你~~再问一句,为什么会这样呢?能详细说下吗???
2011-04-12 22:28
Kid_X
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:216
专家分:515
注 册:2007-10-8
收藏
得分:8 
不同的输入函数对缓冲区内的回车号处理方式是不同的。所以一般可以在需要输入之前用fflush()清空一下缓冲区
2011-04-13 08:50
起名真难
Rank: 1
来 自:广东广州
等 级:新手上路
帖 子:19
专家分:3
注 册:2011-3-31
收藏
得分:0 
回复 4楼 Kid_X
好像好复杂,看不懂,我是初学者~能具提详细说说吗?我想知道原因,我很需要你的回答~谢谢~
2011-04-13 14:52
Kid_X
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:216
专家分:515
注 册:2007-10-8
收藏
得分:0 
我表达能力比较差,简单说说,讲的不是很正确的地方还望包涵。LZ自己再找资料研究一下吧。

对于输入输出,都有缓冲区,对于输入而言,其实就是一个FIFO队列,从键盘输入的字符会放入到该队列的队尾,而scanf函数、getchar()等从标准输入的函数则是从队列的开头读取数据。

举个简单的例子:
LZ的程序在执行时输入第一个整数的地方,如果输入的内容是12abc这五个字符,那么这五个字符会放到缓冲区,当LZ按下回车时,回车符也放到缓冲区中,此时scanf函数开始真正读取数值,它先取出第一个字符,是1,发现是数字字符,进行转换,再取第二个字符,发现2,仍旧是字符,转换成数字,再取第三个字符,是a,不是数字了,则不解析了。这时,读到的整数就是12。后面几个字符仍旧在缓冲区中。下次读取字符串的时候可能就读到abc了。LZ可以自己针对各种情况自己做一下实验,这样更容易掌握。

对于读取不同的内容,对于一些字符有不同的处理方式,例如,对于输入字符串,空格默认也是分隔符,有的还会跳过一些字符等。

所以,对于某些操作,需要在输入之前清空一下缓冲队列,尤其是在通过用户输入一个字符来选择程序不同的流程时。

我之前讲的fflush()函数清空输入流不是标准C中的,所以可能无效,目前试下来gcc下没用,记得以前在VC6下是有用的。可以通过while循环加getchar()来清空缓冲区。其他方法也没想到。
2011-04-17 00:38
快速回复:错在哪里?
数据加载中...
 
   



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

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