<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在學習和回顧該知識前,已經掌握了if語句的結構和用法。
if (條件)
語句;
當條件滿足的情況下,if結構中的語句執行,且只執行一次;條件不滿足則不執行。但是生活中常常需要將一件事情完成很多次,這時候就要用到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++; 這兩條語句),直接程式又去到判斷部分,看是否進行下一次迴圈。
範例一:
看一下下面這段程式碼是什麼意思
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("%cn",ch); //putchar(ch);//這條語句與上一條語句一樣的意思 return 0; }
執行該測試程式碼,在列印結果的視窗,鍵入一個A字元回車,就會列印出A字元。(putchar是指輸出一個字元)
在getchar和鍵盤之間有一個緩衝區,鍵入字元“A”就相當於將“An”放進了緩衝區裡面。
範例二:
假設輸入一段字元作為密碼,將該密碼存放到字串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”之後,還會鍵入一個回車,此時放到緩衝區就放的是“2022n”。
而scanf與getchar是輸入函數,它們不是直接從鍵盤上拿資料,而是從中間的緩衝區去拿資料,如果緩衝區沒有資料,它就會等待從鍵盤上輸入一點資訊到緩衝區裡面去。scanf只會將緩衝區裡面的“2022n”裡的“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
到此這篇關於C語言範例講解while迴圈語句的用法的文章就介紹到這了,更多相關C語言while迴圈內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45