產(chǎn)品價(jià)格的網(wǎng)站建設(shè)三只松鼠口碑營銷案例
🚀 作者:阿輝不一般
🚀 你說呢:不服輸?shù)哪?#xff0c;他們拿什么贏
🚀 專欄:愛上C語言
🚀作圖工具:draw.io(免費(fèi)開源的作圖網(wǎng)站)
如果覺得文章對你有幫助的話,還請點(diǎn)贊,關(guān)注,收藏支持博主,如有不足還請指點(diǎn),博主及時(shí)改正,感謝大家支持!!!
文章目錄
- 🚀前言
- 🚀輸入緩沖區(qū)
- 🚀scanf()函數(shù)
- 🚀gets()函數(shù)
- 🚀getchar()函數(shù)
- ??清空輸入緩沖區(qū)
🚀前言
大家好啊😉!今天阿輝將為大家介紹C語言中scanf、gets以及getchar關(guān)于字符串的輸入,關(guān)注阿輝不迷路哦 😘 ,內(nèi)容干貨滿滿😋,接下來就跟著阿輝一起學(xué)習(xí)吧👊
🚀輸入緩沖區(qū)
輸入緩沖區(qū)是計(jì)算機(jī)系統(tǒng)中用于存儲輸入數(shù)據(jù)的一種緩沖區(qū)
怎么理解他呢,比如我們C語言中的scanf
以及今天阿輝要介紹的函數(shù),他們并非直接讀取我們在鍵盤上敲的數(shù)據(jù),而是我們敲的數(shù)據(jù)先存在緩沖區(qū)內(nèi),然后scanf
從緩沖區(qū)里面讀取的
注意:
上面的圖只是簡單的描述,輸入緩沖區(qū)就像你的飯卡你往里面充錢,一次可能充100塊,但是scanf這頓飯可能就只讀12塊
阿輝今天要講的就是scanf、gets、getchar以及fgets在緩沖區(qū)中是如何讀取的
輸入緩沖區(qū)的數(shù)據(jù)一旦被讀取就不再輸入緩沖區(qū)了
🚀scanf()函數(shù)
scanf()
相信大家都不陌生,他就是通過占位符從標(biāo)準(zhǔn)輸入流中格式化的讀取數(shù)據(jù)然后把數(shù)據(jù)存儲在參數(shù)所指向的位置
1.標(biāo)準(zhǔn)輸入流默認(rèn)是鍵盤輸入
2.參數(shù)就是地址,例如&a
這樣
我們來看一個(gè)🌰栗子
#include<stdio.h>int main()
{int a = 0;int b = 0;scanf("%d%d", &a, &b);printf("a = %d b = %d\n", a, b);scanf("%d%d", &a, &b);printf("a = %d b = %d\n", a, b);return 0;
}
注意:只要scanf
不是使用%c
讀取數(shù)據(jù)時(shí),數(shù)據(jù)前面的空白字符(空格、制表符以及換行)都會被忽略
好吧以上都不是重點(diǎn)😆,重點(diǎn)是對于字符串的讀取
上星期一道??蚈J題給阿輝整的汗流浹背(點(diǎn)擊可跳轉(zhuǎn))
題目:
輸入描述:
輸入一個(gè)字符串,可以有空格輸出描述:
輸出逆序的字符串示例1
輸入
I am a student
輸出
tneduts a ma I
關(guān)于這道題的代碼
#include <stdio.h>
#include <string.h>void reverse(char *p, int sz) {int i = 0;int j = sz - 1;for (i = 0, j = sz - 1; i < sz / 2; i++, j--) {char tmp = *(p + i);*(p + i) = *(p + j);*(p + j) = tmp;}
}int main()
{char arr[10000] = {0};int i = 0;scanf("%[^\n]%*c",arr);int sz = strlen(arr);reverse(arr, sz);printf("%s", arr);return 0;
}
孤陋寡聞的阿輝只會用scanf
用%s
讀,而%s
遇到空格換行制表符就會停止讀取,用%c
讀,換行\n
都給我讀來了我靠真的汗流浹背了,阿輝急忙翻題解,我丟這題解真是讓人兩眼放光😍,gets
還有scanf
的高級用法
scanf
讀字符串的神仙用法:
scanf
可以通過字符集的方式讀取字符scanf("%[a-z]",str)
,a-z
指的是只讀取a到z之間的小寫字母,遇到非范圍內(nèi)的字符停止讀取,當(dāng)然你也可以用[A-Z]
只讀大寫字母,范圍自定義scanf("%[ ^\n ]",str)
,^\n
指的是只讀取非\n
的字符包括制表符和空格,遇到換行停止讀取,當(dāng)然你也可以^\t
,都是是自定義的scanf("%*c",str)
,*
指的是對于一個(gè)字符類型的數(shù)據(jù)只讀取但不存儲給任何變量,就是把這個(gè)數(shù)據(jù)從輸入緩沖區(qū)去掉這一個(gè)操作,也可以%*d
,也是自定義的
🌰栗子
int main()
{char str1[10] = { 0 };char str2[10] = { 0 };scanf("%[a-z]", str1);scanf("%[^\n]", str2);printf("%s\n", str1);printf("%s", str2);return 0;
}
輸入:
abcd1換行
輸出:
abcd --第一行
1 --第二行
因?yàn)榈谝粋€(gè)
scanf
只讀取a-z
之間的數(shù)據(jù),讀到1停止讀取,而1后面還有一個(gè)換行,1和換行都還在輸入緩沖區(qū)內(nèi),因?yàn)榈诙€(gè)scanf
讀到換行就會停止讀取,因?yàn)檩斎刖彌_區(qū)有換行了,你連鍵盤輸入的機(jī)會都沒有了,這里\n
還留在輸入緩沖區(qū)
這里我們對輸入緩沖區(qū)的理解應(yīng)該更加清晰了,scanf
從緩沖區(qū)讀取數(shù)據(jù),輸入緩沖區(qū)有適合的數(shù)據(jù)就不需要你輸入了,就像你飯卡有錢就不用充錢了
如果我們這么寫
int main()
{char str1[10] = { 0 };char str2[10] = { 0 };scanf("%[a-z]%*d%*c", str1);scanf("%[^\n]%*c", str2);printf("%s\n", str1);printf("%s", str2);return 0;
}
輸入:
abcd1換行
ab123換行
輸出;
abcd --第一行
ab123 --第二行
這里第一個(gè)
scanf
里面的%*d%*c
將1和換行\(zhòng)n
給讀取了但并未賦給任何變量,我的理解就是把輸入緩沖區(qū)一個(gè)有符號數(shù)和一個(gè)字符給刪掉,然后到第二個(gè)scanf
的時(shí)候輸入緩沖區(qū)就沒數(shù)據(jù)了得我們自己輸入
🚀gets()函數(shù)
gets
這個(gè)函數(shù)并不會檢查輸入的長度,可能導(dǎo)致緩沖區(qū)溢出,并不建議大家使用,可能出bug,不過gets這個(gè)函數(shù)還是很猛的。
用法:
char *gets(char *str);
str指向字符數(shù)組的指針
返回值,讀取成功為str,讀取錯(cuò)誤為EOF
gets(str)
只能讀取字符包括空格和制表符直到遇到換行符或者文件結(jié)束符停止讀取然后將\n
從輸入緩沖區(qū)刪除,相當(dāng)于scanf("%[ ^\n ]%*c",str)
🚀getchar()函數(shù)
getchar()
從鍵盤獲取一個(gè)字符,返回值也是這個(gè)字符,無參數(shù),直到用戶按下回車鍵或輸入的字符達(dá)到了緩沖區(qū)的最大長度,停止讀取,一次只讀取一個(gè)字符包括空格、換行和制表符,相當(dāng)于scanf("%c",c)
??清空輸入緩沖區(qū)
利用getchar()
我們可以寫一個(gè)清空輸入緩沖區(qū)的函數(shù)
void clearbuffer(void)
{while (getchar() != '\n'){;}
}int main()
{char str1[10];char str2[10];scanf("%s", str1);clearbuffer();scanf("%s", str2);printf("str1 = %s\n", str1);printf("str2 = %s\n", str2);return 0;
}
輸入輸出
1234\n
都被clearbuffer
這個(gè)函數(shù)讀取了,從輸入緩沖區(qū)清除了
這里while判斷的條件是
getchar != ‘\n’
,getchar
讀取到哪個(gè)字符,它的返回值就是哪個(gè)字符,所以,這里我們這樣來清空緩沖區(qū),是連帶\n
一起清理掉的(當(dāng)getchar()吸收了’\n’,則getchar() == ‘\n’ ,不滿足條件就退出while循環(huán)了)
到這里,阿輝今天對于C語言中的scanf、gets以及getchar分享就結(jié)束了,希望這篇博客能讓大家有所收獲, 如果覺得阿輝寫得不錯(cuò)的話,記得給個(gè)贊唄,你們的支持是我創(chuàng)作的最大動力🌹