網站首頁 編程語言 正文
在學習和回顧該知識前,已經掌握了if語句的結構和用法。
if (條件)
?? ?語句;
當條件滿足的情況下,if結構中的語句執行,且只執行一次;條件不滿足則不執行。但是生活中常常需要將一件事情完成很多次,這時候就要用到while語句來實現循環了。
1、while語句結構
while (表達式)
?? ?循環語句;
例子:利用循環結構打印1-10
#include <stdio.h>
int main()
{
int i = 0;
while(i < 10)
{
i++;
printf("%d ", i);
}
return 0;
}
?1 2 3 4 5 6 7 8 9 10
來測試一下在代碼中分別加入continue和break是什么結果
在while循環中,break用于永久地終止循環
int main()
{
int i = 1; //初始化
while (i <= 10) //判斷部分
{
if (i == 5)
break;
printf("%d ", i);
i++; //循環變量的調整部分
}
return 0;
}
運行結果為:
1 2 3 4
將break改為continue看看,發現運行結果為:
輸出4之后,光標持續閃爍,因為在while循環中,continue的作用是跳過本次循環continue后面的代碼(這樣就跳過了printf("%d ", i);i++; 這兩條語句),直接程序又去到判斷部分,看是否進行下一次循環。
2、代碼示例
示例一:
看一下下面這段代碼是什么意思
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
運行結果如下:
輸入什么字母就會輸出什么字母,想要退出該程序的運行,就使用快捷鍵“ctrl + z”。
a
a
A
A
^Z
getchar這個是指如果讀取成功的話,返回的是ASCII碼值,若讀取失敗,則返回的是EOF(end of file),是文件結束標志。
測試getchar的功能
int main()
{
int ch = getchar();
printf("%c\n",ch);
//putchar(ch);//這條語句與上一條語句一樣的意思
return 0;
}
運行該測試代碼,在打印結果的窗口,鍵入一個A字符回車,就會打印出A字符。(putchar是指輸出一個字符)
在getchar和鍵盤之間有一個緩沖區,鍵入字符“A”就相當于將“A\n”放進了緩沖區里面。
示例二:
假設輸入一段字符作為密碼,將該密碼存放到字符串passwd里面,然后彈出一個“請確認密碼”的提示,如果確認密碼正確就鍵入“Y”,輸出“確認成功”;否則鍵入“N”,輸出“確認失敗”。編寫的代碼如下:
int main()
{
char passwd[20] = { 0 };
printf("請輸入密碼:>");
scanf("%s",passwd);//假設輸入的密碼是2022
//這里passwd不取地址的原因是passwd是個數組,數組的數組名本身就是個地址,所以
//此處沒有給passwd加上取地址符
printf("請確認密碼(Y/N):>");
int ch = getchar();
if (ch == 'Y')
{
printf("確認成功\n");
}
else
{
printf("確認失敗\n");
}
return 0;
}
運行該代碼的結果如下:
請輸入密碼:>2022
請確認密碼(Y/N):>確認失敗
顯然,該代碼是存在錯誤的。還沒等輸入Y/N,就提示確認失敗了。這是為甚呢?因為我們在鍵盤上鍵入“2022”之后,還會鍵入一個回車,此時放到緩沖區就放的是“2022\n”。
而scanf與getchar是輸入函數,它們不是直接從鍵盤上拿數據,而是從中間的緩沖區去拿數據,如果緩沖區沒有數據,它就會等待從鍵盤上輸入一點信息到緩沖區里面去。scanf只會將緩沖區里面的“2022\n”里的“2022”拿走,緩沖區里面還剩下“\n”;getchar在讀取的時候,就沒有作等待動作,直接將緩沖區里面的“\n”拿走了,所以還么等我們輸入Y/N,就已經打印了“確認失敗”。
如何修正程序呢?
將執行scanf之后的緩沖區里面的“\n”拿走,也就是將緩沖區清理干凈,這樣的話getchar函數就得等待輸入,就可以正確運行了。
代碼如下:
int main()
{
char passwd[20] = { 0 };
printf("請輸入密碼:>");
scanf("%s",passwd);//假設輸入的密碼是2022
printf("請確認密碼(Y/N):>");
//清理緩沖區
getchar();//處理'\n'
int ch = getchar();
if (ch == 'Y')
{
printf("確認成功\n");
}
else
{
printf("確認失敗\n");
}
return 0;
}
運行結果為:
請輸入密碼:>2022
請確認密碼(Y/N):>Y
確認成功
這時候對于連續的密碼輸入來說是正確運行的,那么對于不連續(中間有空格)的呢?
比如密碼是“2022 abc”,執行結果如下:
請輸入密碼:>2022 abc
請確認密碼(Y/N):>確認失敗
可以看出,程序還是存在紕漏。那么怎么處理呢?這就要將緩沖區里面的多個字符都給清理干凈。此時只一個getchar函數處理不掉空格以及“\n”了,可以使用while循環,讓它一直讀取,直到將“\n”都讀走。
int main()
{
char passwd[20] = { 0 };
printf("請輸入密碼:>");
scanf("%s",passwd);//假設輸入的密碼是2022
printf("請確認密碼(Y/N):>");
清理緩沖區
//getchar();//處理'\n'
//清理緩沖區中的多個字符
int tmp = 0;
while ((tmp = getchar()) != '\n')
{
;
}
int ch = getchar();
if (ch == 'Y')
{
printf("確認成功\n");
}
else
{
printf("確認失敗\n");
}
return 0;
}
請輸入密碼:>2022 abc
請確認密碼(Y/N):>Y
確認成功
示例三:
//只會打印數字
int main()
{
int ch;
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch > '9')
continue;
putchar(ch);
}
return 0;
}
根據ASCII碼值,我們可以知道該段代碼的意思是:如果不是數字就continue,執行continue會跳過putchar(ch)這句話,所以這段代碼最終只會打印輸入的數字,想要終止運行,鍵入“ctrl+z”即可。代碼運行結果如下:
1
1
3
3
9
9
^Z
原文鏈接:https://blog.csdn.net/qq_42822743/article/details/125179644
相關推薦
- 2023-04-07 C語言如何計算字符串長度_C 語言
- 2022-06-06 解決Unity無限滾動復用列表的問題_C#教程
- 2024-01-15 maven常用打包命令
- 2022-10-13 Python?lambda?匿名函數優點和局限性深度總結_python
- 2022-09-26 利用QDir實現刪除選定文件目錄下的空文件夾_C 語言
- 2022-07-04 詳解Python字符串原理與使用的深度總結_python
- 2022-11-16 PyTorch中torch.utils.data.DataLoader實例詳解_python
- 2022-10-03 github訪問速度慢的問題完美解決_相關技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支