分支与循环——中

27 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

1.while

while(表达式) {   循环语句; }

在这里插入图片描述

看代码:在屏幕上打印1-10

#include<stdio.h>
//硬核输出
int main01()
{
	printf("1 2 3 4 5 6 7 8 9 10");//如果要打印1-100,甚至更多 - 那太麻烦了
	return 0;
}
//循环输出
int main02()
{
	//循环的起始是1,终止是10
	int i = 1;//初始化部分
	while (i <= 10)//判断部分
	{
		printf("%d ", i);
		i++;//调整部分
	}
	//三个部分任何一个部分发生变化,都会影响到循环
	return 0;
} 

while循环中的break和continue

#include<stdio.h>
int main01()
{
	int i = 1;
	while (i <= 10)
	{
		if (5 == i)
		{
			break;
		}
		printf("%d ", i);
		i++;
	}
	//结果是1 2 3 4 - 一旦满足条件break就永久跳出循环
	return 0;
}
int main02()
{
	int i = 1;
	while (i <= 10)
	{
		if (5 == i)
		{
			continue;
		}
		printf("%d ", i);
		i++;
	}
	//结果是1 2 3 4 ... ...  - 死循环  - continue的作用是跳过本次循环continue后面的代码,直接去while循环判断部分,进行下一次循环入口的判断
	//这里造成死循环的原因是一旦5==5成立,则会跳过下面的代码(跳过了i++),回到while(i<=10) 
	return 0;
}

getchar和putchar

int main01()
{
	//getchar可以从键盘读取一个字符 - 它的返回值是字符(所对应的ASCII码值);如果读取时遇到了错误或文件结束,则返回EOF
	//putchar可以输出一个字符
	//EOF - end of file - 文件结束标志 - 右击可以对EOF转到定义,发现EOF的值是-1 
	int ch = getchar();
	printf("%c\n", ch);
	putchar(ch);
	//发现它不管输入多少字符,只能输出一个
	return 0;
}
//使用循环的方式让putchar能输出多个字符
int main02()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}
	//事实上getchar不是直接从键盘上读,而是在getchar与键盘之间的缓冲区读
	//当输入"A回车"后 - 缓冲区其实存在两个字符 - 'A','\n'
	//CTRL+Z - getchar就读取结束
	return 0;
}

getchar所应用的场景:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main01()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	//对于数组的数组名本身就是一个地址 - 所以可以不用&
	scanf("%s", &password);//123456\n
	printf("请确认密码(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	//发现我们在输入密码回车后 - 程序并没有等待我们确认密码 - 而是直接确认失败
	//我们都知道:scanf和getchar在读取数据时,是在输入缓冲区里读
	//当我们输入123456\n时,scanf只会读取除\n以外的数据;这时输入缓冲区里还剩1个\n,getchar一看输入缓冲区里有内容,就直接拿走了;'\n'=='Y'为假,执行else
	return 0;
}
//改正后:
int main02()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", &password);//123456 abcdef\n
	printf("请确认密码(Y/N):>");
	getchar();//清理缓冲区 - 把\n拿走
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	//这里我们输入123456 abcdef\n时发现它又停不下来了
	//scanf这里只会把空格前面的字符读走,此时在缓冲区里还剩很多的字符
	return 0;
}
//改正后的改正:
int main03()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", &password);//123456 abcdef\n
	printf("请确认密码(Y/N):>");
	int temp = 0;
	while ((temp = getchar()) != '\n')//使用循环清理缓冲区里的多个字符
	{
		;
	}
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

看代码:结果是什么

#include<stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		if (ch<'0' || ch>'9')//如果是非数字字符则执行continue跳过本次循环,再次判断;否则就输出
		{
			continue;
		}
		else
		{
			putchar(ch);
		}
	}
	//这段程序的功能是只打印数字
	return 0;
}

2.goto

c语言提供了可以随意滥用的goto语句和标记跳转的标号;从理论上goto语句是没有必要的,但是在某些场合还是有用的着的地方 最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环,这种情况break是不适合的。除此之外不建议使用goto for (...) {   for (...)  {   for (...)    {     if (disaster)      goto error;    }   } } 注:goto语句只能在一个函数范围内跳转,不能跨函数

int main()
{
	flag:
	printf("hehe\n");
	printf("haha\n");
	goto flag;
	//结果是死循环 - 这里goto定义了flag;当每次走到goto语句时它都会跳转到与flag匹配的地方
	return 0;
}