1 语法结构
while语句的语法结构如下图所示:
while(循环条件表达式)
循环语句;
循环执行流程图:
循环执行过程:
- 对表达式求值;
- 如果表达式为假,则退出整个循环;
- 如果表达式为真,则执行循环语句,然后跳到第1步;
- 如果循环语句中有break,则退出整个循环;
- 如果循环语句中有continue,则跳过continue后面的所有语句,然后跳到第1步继续执行。
2 示例
2.1 示例1
希望打印数字1-10,代码如下图所示:
int main()
{
int i = 1;
while (i <= 10)
{
printf("i = %d\n", i);
i++;
}
return 0;
}
代码执行结果如下图所示:
如果希望打印数字1-4,可在循环语句中加入break,代码如下图所示:
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
{
break;
}
printf("i = %d\n", i);
i++;
}
return 0;
}
代码执行结果如下图所示:
如果希望跳过打印数字5,在循环语句中加入continue,代码如下图所示:
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
{
continue;
}
printf("i = %d\n", i);
i++;
}
return 0;
}
代码执行结果如下图所示:
光标一直在闪动,程序无法正常结束。循环中遇到continue,则跳过continue后边的语句,继续对循环条件表达式求值。本例中,i++在continue的后面,当遇到continue时跳过i++语句,导致循环变量i的值无法继续更新,始终等于5,程序进入死循环。
修改上面的代码,挪动i++语句的位置,如下图所示:
int main()
{
int i = 1;
while (i <= 10)
{
i++;
if (5 == i)
{
continue;
}
printf("i = %d\n", i);
}
return 0;
}
代码执行结果如下图所示:
程序正常结束,跳过打印数字1和5,斗多余打印数字11,不符合预期。
继续修改代码,i++语句位置保持不动,在continue语句前面增加一条i++语句,如下图所示:
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
{
i++;
continue;
}
printf("i = %d\n", i);
i++;
}
return 0;
}
代码执行后,跳过打印数字5,符合预期,打印结果如下图所示:
2.2 示例2
while循环用于清空stdin缓冲区,代码如下图所示:
int main()
{
char password[20] = { 0 };
// 输入abcde+空格+fgh+空格+回车
printf("请输入密码 : ");
scanf("%s", password);
//清空stdin缓冲区
int ch = 0;
while ((ch = getchar()) != '\n')
{
;
}
//
printf("请确认密码(Y/N) : ");
int ret = getchar();
if('Y' == ret)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
代码执行结果如下图所示:
使用scanf(0函数从标准输入流stdin中读取字符时,往往会有残留字符,会导致下次读取stdin时发生错误。所以,在使用scanf()函数之后,需要清空stdin。较新版本的vs开发工具不再支持使用fflush()函数清空stdin的方法,需要用户来实现清空stdin的功能,而while循环语句+getchar()函数的方法可以很好的实现此功能。
2.3 示例3
需求:只打印数字字符,跳过其他字符,代码如下图所示:
int main()
{
int ch = '\0';
//输入a1+空格+b2+空格+c3+空格+d4+空格+e5+空格+回车
while ((ch = getchar()) != '\n')
{
if (ch < '0' || ch > '9')
continue;
putchar(ch);
}
printf("\n");
return 0;
}
代码执行结果如下图所示:
2.4 示例4
需求:在一个有序数组中查找某个具体的数字n;
方法:二分法;
实现:代码如下图所示:
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int k = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int l_index = 0;
int r_index = 0;
int m_index = 0;
for (k = 1; k < 12; k++)
{
printf("请查找数字%d\n", k);
l_index = 0;
r_index = sz - 1;
while (l_index <= r_index) //注意循环条件
{
m_index = (l_index + r_index) / 2;
if (arr[m_index] < k)
{
l_index = m_index + 1;
}
else if (arr[m_index] > k)
{
r_index = m_index - 1;
}
else
{
printf("Number is found, index is %d\n", m_index);
break;
}
}
if (l_index > r_index)
{
printf("Number is not found.\n");
}
}
return 0;
}
代码运行结果如下图所示:
2.5 示例5
需求:编写代码,演示多个字符从两端移动,向中间汇聚;
实现:代码如下图所示:
int main()
{
char arr1[] = "welcome to bit!!!!";
char arr2[] = "##################";
int left = 0;
int right = strlen(arr1) - 1;//注意字符串结束符'\0'的存在
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
puts(arr2);
Sleep(1000);//等待1000ms = 1s
//清空屏幕
system("cls");//system是一个库函数,可以执行系统命令
left++;
right--;
}
puts(arr2);
return 0;
}