前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >getchar()和scanf()混合使用的坑

getchar()和scanf()混合使用的坑

作者头像
nnngu
发布2020-07-03 10:43:10
1K0
发布2020-07-03 10:43:10
举报
文章被收录于专栏:nnngu

最近在混合使用 getchar()scanf() 的时候遇到一个坑,现在记录一下。

代码中使用 getchar() 处理字符输入,用 scanf() 处理数字输入。

getchar() 读取每个字符,包括空格、制表符和换行符; 而 scanf() 在读取数字时则会跳过空格、 制表符和换行符。

比如下面这个程序,读入一个字符和两个数字,然后根据输入的两个数字指定的行数和列数打印该字符。

代码语言:javascript
复制
#include <stdio.h>
void display(char cr, int lines, int width);
int main(void)
{
	int ch;        /* 待打印字符 */
	int rows, cols;    /* 行数和列数 */
	printf("Enter a character and two integers:\n");
	while ((ch = getchar()) != '\n')
	{
		scanf("%d %d", &rows, &cols);
		display(ch, rows, cols);
		printf("Enter another character and two integers;\n");
		printf("Enter a newline to quit.\n");
	}
	printf("Bye.\n");
	return 0;
}

void display(char cr, int lines, int width)
{
	int row, col;
	for (row = 1; row <= lines; row++)
	{
		for (col = 1; col <= width; col++)
			putchar(cr);
		putchar('\n');/* 结束一行并开始新的一行 */
	}
}

编译、运行程序,发现程序在输出 Enter a newline to quit. 之后就自动退出了。

原来,在输入了一个字符和两个数字之后,需要敲一个回车键,回车键产生了一个换行符。这个换行符不会被例程中的 scanf() 读取,但它会继续留在输入队列中。当程序运行到下一轮循环的 getchar() 函数时,换行符就会被 getchar() 函数读取,导致程序直接结束了。

解决方法:可以在循环内部添加如下代码来消耗输入队列中的换行符以及其他多余的字符:

代码语言:javascript
复制
while (getchar() != '\n')
      continue;

完整代码如下:

代码语言:javascript
复制
#include <stdio.h>
void display(char cr, int lines, int width);

int main(void)
{
	int ch;        /* 待打印字符*/
	int rows, cols;    /* 行数和列数 */
	printf("Enter a character and two integers:\n");
	while ((ch = getchar()) != '\n')
	{
		if (scanf("%d %d", &rows, &cols) != 2)
			break;
		display(ch, rows, cols);
		while (getchar() != '\n')
			continue;
		printf("Enter another character and two integers;\n");
		printf("Enter a newline to quit.\n");
	}
	printf("Bye.\n");
	return 0;
}

void display(char cr, int lines, int width)
{
	int row, col;
	for (row = 1; row <= lines; row++)
	{
		for (col = 1; col <= width; col++)
			putchar(cr);
		putchar('\n');  /* 结束一行并开始新的一行 */
	}
}

如发现有不对的地方,欢迎在评论区指出。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档