Day 28 : C语言 - 如何解决用scanf连续输入时,程序会自动断行的问题?

如标题,scanf是一个「动态输入」的函数,你可以先宣告一个变数a,再用scanf输入,赋予它任意值,每次执行程序都可以输入不同的值给变数a
scanf可以用来输入字元数字字串…等,格式为: scanf(“形式”, &变数名称1);

但用scanf连续输入时,会出现自动结束的问题


假设我们有一程序码长这样:

int main() {
	int a;
	char ch;
	printf("请输入一个整数:");
	scanf("%d", &a);
	printf("请输入一个字元:");
	scanf("%c", &ch);
	printf("a=%d, c1=%c", a, ch);
	return 0;
}

输入完20这个整数,并按enter,它就会自动结束,可是我们还有字元c1还没输入R!!
https://ithelp.ithome.com.tw/upload/images/20211012/20141088BIfdDvEOPV.png

因为你输入完整数20,按下的那个enter(回车)被留在缓冲区,以至於被下一个scanf吸收了,所以c1印出来会是空白的

那有没有什麽方法能解决这件事呢?有!以下有三种解决方法供各位参考


Ex 1:
在第二个scanf里的%c前面加上「空格」,来抵销前面按的enter(回车)

int main() {
	int a;
	char ch;
	printf("请输入一个整数:"); 
	scanf("%d", &a);

	printf("请输入一个字元:");
	/* 在%c前面加上一个空格 */ 
	scanf(" %c", &ch);
	printf("a=%d, c1=%c", a, ch);
	return 0;
}

这样就可以成功输入整数a和字元c1罗!
https://ithelp.ithome.com.tw/upload/images/20211012/20141088npCF837Ste.png


Ex 2:
在第一个scanf後加上ffluch(),清空缓冲区内的资料,这样第二个scanf就不会吸收到enter(回车)

int main() {
	int a;
	char ch;
	printf("请输入一个整数:");
	scanf("%d", &a);

    /* 清空缓冲区内的资料 */
	fflush(stdin);

	printf("请输入一个字元:");
	scanf("%c", &ch);
	printf("a=%d, c1=%c", a, ch);
	return 0;
}

这样也可以成功输入整数a和字元c1
https://ithelp.ithome.com.tw/upload/images/20211012/20141088Jik3WJEUcA.png


Ex 3:
你如果不想用fflush()清空缓冲区,你也可以用getchar()去吸收enter(回车)这个字元

int main() {
	int a;
	char ch;
	printf("请输入一个整数:"); 
	scanf("%d", &a);

	/* 吸收空格这个字元 */
	getchar();

	printf("请输入一个字元:");	
	scanf("%c", &ch);
	printf("a=%d, c1=%c", a, ch);
	return 0;
}

结果会和使用fllush()一样:
https://ithelp.ithome.com.tw/upload/images/20211012/20141088eK8ufkWiIP.png


以上三种解决方法,不仅适用enter(回车),也适用於「空格」喔!

现在我们使用Ex 1.的方式,将整数a字元ch放在一起输入,并在输入时用「空格」将ach隔开:

int main() {
	int a;
	char ch;
	printf("请输入一个整数和字元:");
	scanf("%d %c", &a, &ch);
	printf("a=%d, c1=%c", a, ch);
	return 0;
}

这样也可以成功输入整数a和字元c1喔!
https://ithelp.ithome.com.tw/upload/images/20211012/20141088nRWnhgyfTu.png


以上就是今天的介绍


<<:  [ 卡卡 DAY 27 ] - React Native keyboard 之乱之按萤幕就收键盘

>>:  Day30 阿里云30後结语

WordPress 如何引用 Bootstrap 的 CSS 及 JS 档案制作精美画面

Bootstrap 是全球最流行的前端开发工具,可以快速设计及自定义响应式网站。而 WordPres...

Day 14 读 Go Concurrency Patterns - Rob Pike I

本篇是看 Go Concurrency Patterns 的心得 简报网址:https://talk...

AlwaysOn 可用性群组 (AOAG) - 心得分享

DBA Bootcamp 下面这张图说明了 SQL Server AlwaysOn 可用性群组 (A...

Day-24 : 开发时,使用到tailwindCSS,今天来讲安装

yarn add -D tailwindcss@latest postcss@latest auto...

[Day 29] Partitioning (3) - Rebalancing Partitions

Rebalancing Partitions 每经过一段时间,资料库可能会因为以下几件事情改变: 为...