循环语句
目录
1.while循环
<1>语法结构
<2>举例应用
打印1-10
<3>while循环中的break和continue
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
/*if (i == 5)
break;*/ //在while循环中,break用于终止循环
//加上后,输出结果为1-4
/*if (i == 5)
continue;*/ //在while循环中,作用为跳过本次循环代码,直接去判断部分,看是否进行下一次循环
//加上后,输出结果为1-4 后有一个光标
printf("%d ", i);// \n 竖着输出-换行,无为横着输出
//%d 后有空格输出结果有空格
i++;
//输出结果为1-10
}
return 0;
}
添加break
break ---- 用于终止循环(永久终止循环)
添加continue
continue ---- 跳过本此循环代码,直接去判断部分,看是否进行下一次循环
在while循环中,continue跳过了i++,直接到判断部分,致使结果为1 2 3 4 _
<4>拓展
//getchar 获取一个字符 putchar输出一个字符
#include<stdio.h>
int main()
{
int ch = getchar();//读取字符放入ch
//printf("%c\n", ch);
putchar(ch);//可替代printf("%c\n",ch);
return 0;
}
getchar 读取到字符的时候返回的是字符的ASCII码值,如果读取失败,返回的是EOF ---> -1
ASCII取值范围:0-127
#include<stdio.h>
int main()
{
int ch = 0;
//ctrl + z - getchar;
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
return 0;
} //输入即输出,两者相同
#include<stdio.h>
int main()
{
char password[20] = { 0 };//password本身就是地址不需要添加&
printf("请输入密码:>");//按一下空格键可出来
scanf_s("%s", password,20);
printf("请确认密码(Y/N):>");
int ch = getchar();
if (ch == 'Y')
{
printf("欢迎回来\n");
}
else
{
printf("密码错误\n");
}
return 0;
}
scanf/getchar不是从键盘上直接读取数据的,而是从输入缓冲区读取,输入ASDFG\n(回车),scanf读取了ASDFG,getchar读取数据时,缓冲区还剩一个\n,getchar会把\n读走,即ch = \n,所以输出时无需确认成功\失败直接输出密码错误。
此时需要清除缓冲区的\n,使用getchar处理\n.
scanf默认读取到空格就结束了,在此时如果输入密码时存在空格会发生以下情况:
此时虽然有getchar清除缓冲区的内容,也会输出密码错误,原因:getchar读取一个字符,当输入密码为1234 56时,getchar();清除掉了4后的空格,56\n仍留在缓冲区。当getchar再次读取时读到5,输出密码错误。
此时可以考虑写一个循环,用于清理缓冲区。代码如下:
#include<stdio.h>
int main()
{
char password[20] = { 0 };//password本身就是地址不需要添加&
printf("请输入密码:>");//按一下空格键可出来
scanf_s("%s", password,20);
//清理缓冲区
while (getchar() != '\n')
{
;
}
printf("请确认密码(Y/N):>");
int ch = getchar();
if (ch == 'Y')
{
printf("欢迎回来\n");
}
else
{
printf("密码错误\n");
}
return 0;
}
scanf("%[^\n]",arr] --- 可以一直读到\n为止
2.for循环
<1>语法
for(表达式1;表达式2; 表达式3)
初始化 判断 调整
<2>举例应用
打印1-10
<3>for循环中的break和continue
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
/*if (i == 5)
break;*/ //加上后输出结果为1-4
/*if (i == 5)
continue;*/ //执行i++,输出结果没有5,为1-4和6-10
//不会陷入死循环,与while相比,i++的位置不相同,结果不同
printf("%d ", i);
//不可以在for循环体内修改循环变量,防止for循环失去控制
}
return 0;
} //输出1-10
添加break
添加continue --- 在for循环中,continue跳过本次循环,直接到判断部分,没有跳过i++,不会陷入死循环。
<4>for循环的变种
1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
//判断部分省略——判断部分恒为真
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 0 ; i < 3; i++)
{
for (j = 0 ; j < 3; j++)//如果没有i = 0,j = 0;输出结果为3行hehehe
//一次循环后,j被赋值为3,后续无法进入循环
{
printf("hehehehe\n");
}
}
return 0;
}
如果将 i = 0和 j = 0 改为 i j,则输出结果为
原因:一次循环进行后,j被赋值为3 无法进行后续循环,只打印3行hehehehe.
3.do while循环
<1>语法/特点
do
循环语句;
while(表达式);
do语句特点:循环至少执行一次,使用的场景有限,所以不是经常使用。
<2>举例应用
打印1-10
do while()循环,先循环再判断。
<3>do while循环中的break和continue
#include<stdio.h>
int main()
{
// do while()循环 先循环再判断
// do 循环语句 while(表达式)
int i = 1;
do //do语句的特点 :循环至少执行一次,使用场景有限,所以不经常使用
{
/*if (i == 5)
break;*/ //输出结果为1-4 break为跳出循环,并非整个程序
/*if (i == 5)
continue;*/ //当i = 5 时 会跳过i++,进入死循环,输出1-4 光标
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
//输出结果为1-10
}
添加break
添加continue---continue跳过了i++
4.go to 语句
一个关机程序
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char arr[20] = { 0 };
system("shutdown -s -t 60");
again:
printf("请注意,你的电脑在1分钟内关机,如果输入:我是猪,就取消关机\n");
scanf("%s", arr);
if (strcmp(arr, "我是猪") == 0)
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}