C語言示例講解while循環語句的用法

在學習和回顧該知識前,已經掌握瞭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

到此這篇關於C語言示例講解while循環語句的用法的文章就介紹到這瞭,更多相關C語言while循環內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: