从0开始学c语言-12-循环执行语句(1)while语句、getchar、putchar、缓冲区

本人0基础开始学编程,我能学会的,你也一定可以,学会多少写多少。

下载安装请从官网入手,社区版本即可,这里主要使用的软件是VS2019,图标如下。

 上一篇:从0开始学c语言-11-if分支语句、switch分支语句_阿秋的阿秋不是阿秋的博客-CSDN博客

        控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成, C 语 言有九种控制语句,可以分为以下三类:
        1. 条件判断语句也叫分支语句: if 语句、 switch 语句;
        2. 循环执行语句: do while 语句、 while 语句、 for 语句;
        3. 转向语句: break 语句、 goto 语句、 continue 语句、 return 语句。

目录

循环执行语句

while语句

语法结构

执行流程

 代码演示

学点新知识(getchar、putchar、缓冲区)

缓冲区

利用它整点新活

ASCII码表的应用


循环执行语句

上一篇我们学了分支语句,分别是if语句和switch语句,这两个语句都是执行一次,而在程序设计中,我们还需要面对很多情况,于是循环执行语句就出现了。

while语句

语法结构

//while语法结构
while(表达式)  //表达式结果为真则执行循环语句
    循环语句;

执行流程

从0开始学c语言-12-循环执行语句(1)while语句、getchar、putchar、缓冲区_第1张图片

 代码演示

int main()
{
	int a = 0;
	while (a <= 10)
	{
		//if (a == 5)
		//	break;  //在while循环中,break用于永久的终止循环
		if (a == 5)
			continue;  //continue跳过本次循环它之后的语句
		               //来到while语句的表达式部分,判断是否进行下一次循环
		printf("%d\n", a);
		a++;
	}
	return 0;
}

注释掉的break部分打印结果是0 1 2 3 4。

continue部分打印结果是0 1 2 3 4 死循环。

从这段代码中我们学到的是:

        1.while循环语句中的break是用于永久终止循环的。

        2.while循环语句中continue跳过本次循环它之后的语句,来到while语句的表达式部分,判断是否进行下一次循环。

学点新知识(getchar、putchar、缓冲区)

        getchar()是指从键盘(也就是标准输入)获取一个字符,返回类型是int类型,正确读取返回的是读取到字符的ASCII码值,读取错误或者读取结束会返回EOF。简单点就是说打印从键盘获取的一个字符
        EOF是文件的结束标志  end of file,代码中敲出EOF 右击选中转到定义,它的意思代表-1。

        putchar()输出一个字符,这是一个函数,括号内是函数调用参数。

int main()
{
	int a = getchar();
	printf("%c\n", a); //输入两个h只会打印一个h
	putchar(a);  //输出一个字符,这是一个函数,括号内是函数调用参数
	return 0;
}

从0开始学c语言-12-循环执行语句(1)while语句、getchar、putchar、缓冲区_第2张图片

上面那段代码也可以这么写

int main()
{
	int b = 0;
	b = getchar();
	putchar(b);
	return 0;
}

现在我们加上一个循环。

int main()
{
	int a = 0; //运行想结束的话,按ctrl+z后回车
               //ctrl+z让getchar读取到EOF
	while ((a = getchar()) != EOF)
	{
		putchar(a);
	}
	return 0;
}

从0开始学c语言-12-循环执行语句(1)while语句、getchar、putchar、缓冲区_第3张图片

 这样就可以打印很多个字符啦!

细心的小伙伴有没有发现,每次回车输出之后再重新输入字符的时候自动换行了呢?

讲一下缓冲区

缓冲区

getchar和键盘输入之间有个缓冲区,你可以理解为字符们的停车场,在这里排队等着被输出。

从0开始学c语言-12-循环执行语句(1)while语句、getchar、putchar、缓冲区_第4张图片

        getchar和键盘之间有个缓冲区,比如你输入a并敲回车等着输出,那么在缓冲区会是a\n,getchar先读取到a并打印出来,再返回到缓冲区读取下一个字符,也就是\n,打印后就会换行。

这就是为什么每次会自动换行的原因。

利用它整点新活

//这里用scanf_s代替的同学,这个代码会报错
//scanf_s要求在输入char或字符串数组时,添加最大长度作为参数
//所以应该是scanf_s("%s", password,20);
int main()
{
	char password[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", password);  //password本来就是地址,所以不需要取地址
	printf("请确认密码,输入Y or N\n");
	int aqiu = getchar();
	if ('Y' == aqiu)  //注意字符加单引号
		printf("ok");
	else
		printf("wrong");
	return 0;
}

从0开始学c语言-12-循环执行语句(1)while语句、getchar、putchar、缓冲区_第5张图片

 很奇怪,我们还没有确认呢,怎么就直接错误了呢?

这又和缓冲区有关系啦!

从0开始学c语言-12-循环执行语句(1)while语句、getchar、putchar、缓冲区_第6张图片

         回车会触发scanf读取内容,回车在缓冲区就是\n,敲下回车会把键盘按出来的信息放到缓冲区里,然后scanf才会读取信息,scanf读取信息的时候不会读取\n,getchar这时候来到缓冲区看到了\n,于是直接拿走。所以我们连确认密码的机会都没有了。

那好吧,我们改进一下。

int main()
{
	char password[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", password);  
	printf("请确认密码,输入Y or N\n");
	getchar();  //清理缓冲区,处理'\n'
	int aqiu = getchar();
	if ('Y' == aqiu)
		printf("ok");
	else
		printf("wrong");
	return 0;
}

我们多加了一个getchar,让它清理多余的\n去了。

 结果很不错,但是有盲点。比如,空格。

从0开始学c语言-12-循环执行语句(1)while语句、getchar、putchar、缓冲区_第7张图片

是的,scanf函数也不读取空格……,所以导致我们的设置清理缓冲区的getchar()拿走空格就走了,于是确认密码的getchar()又拿走了剩下的\n就走了,我们又没办法确认密码了。

再改进一下!

int main()
{
	char password[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", password);  //gets就可以读去空格了,因为他是读取一行
	printf("请确认密码,输入Y or N\n");
	int ha = 0 ;
	while ((ha = getchar()) != '\n')
	{
		;  //空语句,清理缓冲区
	}
	int aqiu = getchar();
	if ('Y' == aqiu)
		printf("ok");
	else
		printf("wrong");
	printf("%s", password);  //但是空格后的密码不会被读取到了
	return 0;
}

 我们加了while语句来清空缓冲区,终于可以确认密码了呢!

从0开始学c语言-12-循环执行语句(1)while语句、getchar、putchar、缓冲区_第8张图片

但是,scanf依旧不会读取空格,我们的密码已经不是我们想要的样子了,呜呜呜!

gets就可以读去空格了,因为他是读取一行,但我们先不验证了,继续往前走!

ASCII码表的应用

int main()
{
	int aqiu = 0;
	while ((aqiu = getchar()) != EOF)
	{
		if (aqiu < '0' || aqiu>'9')  //注意0和9用单引号括起来表示字符,看一下ASCII码表
			continue;
		putchar(aqiu);  //也就是说aqiu > '0' && aqiu<'9'的字符会打印出来
	}
	return 0;
}  //同时输入字母和数字的话只打印数字,我们调试看一下过程

ASCII码对照表-完整ASCII码表-我就查查询

        从这个网站里找aqiu > '0' && aqiu<'9'的字符,也就是说图中框起来的字符,就是我们能打印出的字符。

从0开始学c语言-12-循环执行语句(1)while语句、getchar、putchar、缓冲区_第9张图片

 从0开始学c语言-12-循环执行语句(1)while语句、getchar、putchar、缓冲区_第10张图片

 可以看到,其他字符都不会被打印出来。

总结

        1.while循环语句中的break是用于永久终止循环的。

        2.while循环语句中continue跳过本次循环它之后的语句,来到while语句的表达式部分,判断是否进行下一次循环。

        getchar()是指从键盘(也就是标准输入)获取一个字符,返回类型是int类型,正确读取返回的是读取到字符的ASCII码值,读取错误或者读取结束会返回EOF。简单点就是说打印从键盘获取的一个字符
        EOF是文件的结束标志  end of file,代码中敲出EOF 右击选中转到定义,它的意思代表-1。

        putchar()输出一个字符,这是一个函数,括号内是函数调用参数。

        scanf读取信息的时候不会读取\n和空格。

下一篇:从0开始学c语言-12-循环执行语句(2)for语句_阿秋的阿秋不是阿秋的博客-CSDN博客

你可能感兴趣的:(从0开始学c语言,c语言,visualstudio,学习)