3.循环结构
3.1 while语句
一般形式: while(判断语句)
{
执行语句;
}
例如:
int i = 1;
while(i<=10)
{
printf("%d",i);
i++;
}
输出结果为 1 2 3 4 5 6 7 8 9 10
注意点1
区分并准确理解break与continue的作用
int i = 1;
while(i<=10)
{
if(i == 5)
break;
printf("%d",i);
i++;
}
在此处体现break的作用,上述代码输出结果为 1 2 3 4。当i=5时执行if语句,在break作用后就完成了整个程序,可见break的作用为终止当前循环(在此就是while的{}所包含的代码块的循环)。
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
printf("%d",i);
i++;
}
上述代码结果也是 1 2 3 4,但是可以看到程序并未结束,这意味着陷入死循环。continue的作用是结束本次循环,直接进入下一次循环(在此处即直接跳转到while语句继续执行),因为i恒为5,故而陷入死循环。
所以不难总结,break跳出当前循环体,continue仅为跳出当前循环,进入循环体的下一次循环。
注意点2
while语句具有其他特别的使用方法
int main()
{
int ch = 0;
while((ch=getchar()) != EOF)
{
putchar(ch);
}
return 0;
}
有必要补充一下新接触到的函数:
①getchar:类似于scanf函数,即输入函数,但getchar如其名,一次只能输入一个字符
②putchar:类似于printf函数,即输出函数,但putchar和getchar一样,一次也只能输出一个字符
③EOF:全称为end of file,即文件结束标志
在执行代码时会发现无论我们输入什么都会对于输出什么,但是似乎没有办法结束程序,难道这是一个死循环吗?
当然不是这样,EOF的作用便在此处体现出来了,当输入ctrl+z时我们发现程序顺利结束了,因为crtl+z的ASCII值为-1,等于了EOF,而正常的ASCII值不会出现-1,所以说明该程序不会自动结束而只会在手动输入ctrl+z时才会结束。
int ret = 0;
char passord[20] = {0};
printf("请输入密码:>"); //输入123456
sacnf("%s",password);
printf("请输入(Y/N):>");
ret = getchar();
if(ret == 'Y')
{
printf("确认成功\n");
}
else
{
printf("放弃确认\n");
}
当输入123456时,发现没有第二次输入(getchar),反而直接输出了“放弃确认”。通过监视窗口发现ret赋值10,这是为什么呢?
这里不得不提到输入缓冲区的概念,在输入123456的时候,实际输入的是123456\n,这时scanf调取输入缓冲区的123456,剩下\n。当到了getchar的时候直接提取了剩下的字符\n,所以导致没有再次输入(getchar)的机会,而\n的ASCII值为10,所以ret被赋了10的值。
改进如下:
int ret = 0;
char passord[20] = {0};
printf("请输入密码:>"); //输入123456
sacnf("%s",password);
printf("请输入(Y/N):>");
getchar();
ret = getchar();
if(ret == 'Y')
{
printf("确认成功\n");
}
else
{
printf("放弃确认\n");
}
当插入一个getchar()后,将缓冲区中的\n提取出去,然后缓冲区中无字符,后续getchar即可等待输入。但是当输入1234 ABCD后发现又出现bug了,原因很明显,因为空格的存在使得第一次提取后缓冲区剩余ABCD\n,因此一次提取明显不足以清空缓冲区。所以我们自然想到了能不能利用循环来实现多次提取以清空缓冲区呢?
再做出如下改进:
int ret = 0;
char passord[20] = {0};
printf("请输入密码:>"); //输入123456
sacnf("%s",password);
while((ch=getchar()) != '\n')
{
;
}
printf("请输入(Y/N):>");
ret = getchar();
if(ret == 'Y')
{
printf("确认成功\n");
}
else
{
printf("放弃确认\n");
}
通过加入一个while循环体即可,不断提取字符直到n的出现。
另外举一个例子,
int main()
{
while((ch=getchar()) != EOF)
{
if(ch < '0' || ch > '9')
continue;
putchar(ch);
}
return 0;
}
可以发现该代码的输出结果只会是0~9的数字。
本文为学习C语言心得与笔记记录,部分举例来源于B站C语言教学up主鹏哥