在C语言中连续使用scanf()函数出现的问题
#include<stdio.h> int main()
{
char string_c[],*c;
printf("input string:\n");
scanf("%c",string_c);
printf("input a char:\n");
scanf("%c",c);
pritnf("%s %c",string_c,*c);
return ;
}
比如上面这种情况会发生错误,当程序运行会发生当输入字符串之后,不需要输入第二次的字符,它直接出结果。其实是第一次输入字符串之后回车,最后'\n'没有给String_c,而是保存在缓存中,当第二次需要输入时,直接把缓存中的字符赋值。
解决方法:
(1)将两个scanf()函数写为一个sancf("%s %c",striing_c,c);
(2)在第一个scanf()函数下面写清空缓存操作:fflush(stdin)刷新标准输入缓冲区
(3)在第一scanf()函数加入 getchar() ,将'\n'直接取出,让它不在起作用
(4)在一个scanf()函数这么写:scanf("%c\n",string_c)
原文链接:https://blog.csdn.net/PyDongJava/article/details/84572002
#include<stdio.h>
int main()
{
char ch1,ch2;
printf("Input for ch1:/n");
scanf("%c",&ch1);
printf("ch1=%c/n",ch1);
printf("Input for ch2:/n");
scanf("%c",&ch2);
printf("ch2=%c/n",ch2);
}
表面上看这段程序是没有错的,也可以运行,但运行过程中到第二个scanf输入值给ch2时,程序不会停止,而是直接运行到最后一个printf !
为什么?当时百思不得其解。。。
今天上网查了下才知道,原来scanf是从标准输入缓冲区中读取输入的数据,而%c的字符输入格式会接收回车字符,在输入第一个scanf时输入字符后按 回车结束,输入缓冲中保存了这个回车符,遇到第二个scanf时,它自动把这个回车符赋给了ch2。而如果第二个scanf的输入格式不是%c时,由于格 式不匹配,这个回车符会被自动忽略,所以只有在连续输入两个%c的格式时才会出现这样的问题!
解决办法:(二办法任选其一)
1。清空输入缓冲区
第一个scanf后加入语句:fflush(stdin); //C语言清空输入缓冲区函数
2。格式控制中加入空格
将第二个scanf改为:scanf(" %c",&ch2);//在%号前面加一个空格
scanf格式输入时要求输入格式与格式控制符中的完全一样(如:scanf("abcd%c",&ch);输入时必须输入abcde,ch得到的值为e)空格可以抵消前面输入的回车符。
原文链接: https://www.cnblogs.com/GoldCrop/p/11306547.html
在C语言中连续使用scanf()函数出现的问题的更多相关文章
- C语言中可变参数的函数(三个点,“...”)
C语言中可变参数的函数(三个点,“...”) 本文主要介绍va_start和va_end的使用及原理. 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end ...
- 【C语言】05-printf和scanf函数
一.printf函数 这是在stdio.h中声明的一个函数,因此使用前必须加入#include <stdio.h>,使用它可以向标准输出设备(比如屏幕)输出数据 1.用法 1> pr ...
- C语言第五节scanf函数
变量的内存分析 字节和地址 为了更好地理解变量在内存中的存储细节,先来认识一下内存中的"字节"和"地址". 内存以"字节为单位" 0x表示的 ...
- 【C语言】03-printf和scanf函数
一.printf函数 这是在stdio.h中声明的一个函数,因此使用前必须加入#include <stdio.h>,使用它可以向标准输出设备(比如屏幕)输出数据 1.用法 1> pr ...
- C语言入门:05.scanf函数
一.变量的内存分析 1.字节和地址 为了更好地理解变量在内存中的存储细节,先来认识一下内存中的“字节”和“地址”. (1)内存以“字节为单位”
- C/C++编程笔记:C语言基础printf()和scanf()函数,大学入门知识
在解释这两个函数之前,为了方便大家更容易理解,我们先来讲讲下面的这幅图. 这个图中的例子其实很简单,我们就是把题目通过输入设备(例如键盘鼠标)传输到计算机中,然后让计算机进行运算得出结果,再然后把 ...
- C语言基础printf()和scanf()函数
在程序的运行中,我们经常会进行一些输入输出的操作,用来实现交互.为此, C语言便给出了 printf() 函数和 scanf() 函数用来实现输入和输出两个动作. 其中,printf()函数用于向控制 ...
- 简答的理解C语言中的各种类型函数
1.变参函数 变长参数的函数即参数个数可变.参数类型不定 的函数.最常见的例子是printf函数.scanf函数和高级语言的Format函数.在C/C++中,为了通知编译器函数的参数个数和类型可变(即 ...
- 【C语言】gets()和scanf()函数的区别
scanf函数与gets函数 scanf函数和gets( )函数都可用于输入字符串,但在功能上有区别.若想从键盘上输入字符串"hi hello",则应该使用gets函数. gets ...
随机推荐
- sublime text3 - vue修改data,视图无更新
ubuntu系统使用sublime text3做vue开发的时候遇到了一个问题,就是修改vue文件并保存后视图页面并不会随之修改,只有重新run dev时修改才会生效,原因没找到 猜想应该是subli ...
- Java并发编程的艺术笔记(三)——Thread.join()
t.join()方法只会使主线程进入等待池并等待t线程执行完毕后才会被唤醒.并不影响同一时刻处在运行状态的其他线程.它能够使得t.join()中的t优先执行,当t执行完后才会执行其他线程.能够使得线程 ...
- bootstrap 讲解(中)
bootstrap:常用于后台开发,如学生管理系统,虽然稍显笨重,但也是一个开发的利器 推荐下载 3.3.7 版本 也可下载最新版4.3.1 (最新版在手机端不起效果) 且依赖 jQuery 的封装库 ...
- docker-容器完整构建过程
container 代码app,构建,运行,分享(推送)image mkdir img1 cd img1 [root@cu-tmp-201 img1]# ls app.py Dockerfile re ...
- C# WinForm开发系列学习 地址 很详细
http://www.cnblogs.com/peterzb/archive/2009/07/27/1531910.html
- mysql 批量删表
Select CONCAT( 'drop table ', table_name, ';' ) FROM information_schema.tables Where table_name LIKE ...
- Django中Cookie和Session配置和操作
Cookie Cookie以键值对Key-Value形势进行信息的存储. Cookie基于域名安全,不同域名的Cookie是不能互相访问的 Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏 ...
- 【BASIS系列】SAP Basis系统管理中重置用户缓冲哪些需要注意
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[BASIS系列]SAP Basis系统管理中重 ...
- Java与C#不同
1.C#方法定义可以有默认参数,而Java则不支持该方式. C#方法定义 public void ShowMessage(string text,string orderId="" ...
- IP地址相关运算(如VLSM,超网汇总)
1.根据IP地址+子网掩码算出IP地址所在的网段(网络号) 例子: IP地址192.168.10.33,子网掩码为:255.255.255.240 (/28) ,写出所在的网络号 1.得出子网的块大小 ...