关于scanf("%c",&ch)直接跳过的问题
printf("请输入一个年份:\n");
scanf("%d",&year);
// setbuf(stdin,NULL);//或者直接用getchar();
//在键盘输入一字符,显示其类型(数字、大写字母、小写字母、其他)
char ch;
printf("请输入一个字符:\n");
scanf("%c",&ch);
if(ch>='1'&&ch<='9')
printf("this is digital\n");
else if (ch>='A'&&ch<='B')
printf("this is capital letter\n");
else if (ch>='a'&&ch<='z')
printf("this is letter\n");
else
printf("other!\n”);
2000
请输入一个字符:
other!
{
printf("请输入字符串长度:\n");
scanf("%d",&n);
}
setbuf(stdin,NULL); //<1>
char a[n],b[n];
printf("输入字符串:\n");
for (int i=0; i<n; i++)
{
scanf("%c",&a[i]);
}
printf("输出字符串为:\n");
for (int i=0; i<n; i++)
{
b[i]=a[n-1-i];
printf("%c",b[i]);
}
5
输入字符串:
hello
输出字符串为:
lleh
纠其根源,我们先来了解一下scanf()是怎么接受数据的。
首先,当我们的pc指向scanf这句时,系统并不是等待用户输入,而是判断输入缓冲区有没有符合格式的内容,如果有,则直接读取。
知道了这个,我就应该明白,scanf("%c",&ch);不是没有读到数据,而是读到了我们不知道的数据。
那问题又来了,它读到了什么??
好吧,这就要说到行缓存;
我们用scanf()的时候都要按下enter键,那enter键按了之后去哪儿了??
好吧,问题基本应该知道了,enter键也进入了输入缓存区,也就是scanf("%c",&ch);
读到了'\n';
解决办法,很简单,既然缓存区有东西,那我们就清空它呗~~
setbuf(stdin,NULL);(这个windows和linux下都可以)
fflush(stdin);(这个只能windows);
关于scanf("%c",&ch)直接跳过的问题的更多相关文章
- scanf,sscanf利用format跳过干扰的空格
scanf,sscanf利用format跳过干扰的空格 用了一点时间做读取配置部分的代码,希望一次记录上读取N个数据, 希望读取的格式就是一个IP地址加上端口号,希望把IP地址读取到4个短整数里面,端 ...
- scanf("%c", &ch)和scanf(" %c", &ch)和scanf("%s", str)的注意事项
scanf("%c", &ch)和scanf(" %c", &ch): %c会读取回车和空格,所以一定要使用后者,即在%c前面加一个空格. %s ...
- scanf函数与输入缓冲区
本文链接:http://www.cnblogs.com/xxNote/p/4008668.html 今天看书的时候遇到scanf函数与缓冲区的问题,产生了一些猜想即:应该有一个指针来记录缓冲区中读取到 ...
- scanf的一些技巧
一.scanf和gets 1.不同点: char string[50]; scanf("%s",string); //当遇到回车,空格和tab键会自动在字符串后面添加'\0',但是 ...
- printf与scanf的返回值、注意点
printf()的返回值为其输出字符串常量的字符数(注意字符数与字数的区别)注意计数针对所有的打印字符,包括空格和不可见的换行字符(不包括字符串的空字符). scanf()函数返回成功读入的项目的个数 ...
- scanf 与 cin 的区别
在论坛上看到有人提出一个如下的问题,在此总结一下. 原问题: http://topic.csdn.net/u/20110414/22/90d0606c-9876-48e4-9b69-bd8bd8a41 ...
- [笔记]scanf的使用(主要是针对char)
学的是C++,用cin cout也用的很顺溜,写自己的类时重载"<<"与">>"运算符也很爽,但是发现在刷算法竞赛题时,cin cout ...
- 青蛙跳台阶(C、Python)
C语言: /* ----------------------------------- 当n = 1, 只有1中跳法:当n = 2时,有两种跳法:当n = 3 时,有3种跳法:当n = 4时,有5种跳 ...
- C Primer Plus学习笔记(六)- C 控制语句:分支和跳转
if 语句: if 语句被称为分支语句(branching statement)或选择语句(selection statement) if 语句的通用形式: if (expression) state ...
随机推荐
- error1
#include<stdio.h>main(){ int a[10],i,m,n,j; for(i=3;i<10;i++) scanf("%d",&a ...
- Android JSON数据的读取和创建
预先准备好的一段JSON数据 { "languages":[ {"id":1,"ide":"Eclipse"," ...
- zendstudio -chinese
http://archive.eclipse.org/technology/babel/index.php http://www.eclipse.org/babel/downloads.php 注册码 ...
- C语言Printf格式
使用printf打印时发现,如果数据类型和打印使用的类型不一致,结果就是混乱的. 这是因为printf本身并不进行数据的类型转换,他只是把输入按照给定的数据格式输出,如果二者不匹配,那么由于不同数据类 ...
- In-System Debugger for 8051 Devices(ISD 8051单片机在线调试器)
此文档包含了最新版本的说明及最近的更新特别是对 ISD51 的说明(用户手册没有此说明) Keil Software,Inc and Keil Elektronik GmbH保留所有此文件中涉及的信息 ...
- MCI 函数与命令
Microsoft 提供的 MMSYSTEM.H 文件中定义了调用 MCI 功能的数据类型和函数原型.在使用 MCI 功能的任何源模块中都应包含该文件. 1. MCI 函数 所有的 MCI 函数名都以 ...
- 解决ArcSDE图层名被占用的问题
点击文章查看 当你发现上面那篇文章时你已经接近成功了,但还差最后一步! <!- -delete from sde.GDB_OBJECTCLASSES where NAME = upper(' ...
- opencv 图像修复函数
void cv::inpaint( const Mat& src, const Mat& mask, Mat& dst, double inpaintRange, int fl ...
- paip.c++ qt messagebox用法
paip.c++ qt messagebox用法 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net ...
- HTML系列(九):表单
一.表单标签form 表单标签用于申明表单,定义采集数据的范围,即<form>包含的数据将被提交到数据库上,包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法. 表单能够包 ...