愛上C語言:scanf、gets以及getchar輸入字符串你真的懂了嗎

🚀 作者:阿輝不一般
🚀 你說呢:不服輸的你,他們拿什么贏
🚀 專欄:愛上C語言
🚀作圖工具:draw.io(免費開源的作圖網站)
請添加圖片描述

如果覺得文章對你有幫助的話,還請點贊,關注,收藏支持博主,如有不足還請指點,博主及時改正,感謝大家支持!!!

文章目錄

  • 🚀前言
  • 🚀輸入緩沖區
  • 🚀scanf()函數
  • 🚀gets()函數
  • 🚀getchar()函數
    • ??清空輸入緩沖區

🚀前言

大家好啊😉!今天阿輝將為大家介紹C語言中scanf、gets以及getchar關于字符串的輸入,關注阿輝不迷路哦 😘 ,內容干貨滿滿😋,接下來就跟著阿輝一起學習吧👊

🚀輸入緩沖區

輸入緩沖區是計算機系統中用于存儲輸入數據的一種緩沖區
怎么理解他呢,比如我們C語言中的scanf以及今天阿輝要介紹的函數,他們并非直接讀取我們在鍵盤上敲的數據,而是我們敲的數據先存在緩沖區內,然后scanf從緩沖區里面讀取的

請添加圖片描述
注意:
上面的圖只是簡單的描述,輸入緩沖區就像你的飯卡你往里面充錢,一次可能充100塊,但是scanf這頓飯可能就只讀12塊
阿輝今天要講的就是scanf、gets、getchar以及fgets在緩沖區中是如何讀取的
輸入緩沖區的數據一旦被讀取就不再輸入緩沖區了

🚀scanf()函數

scanf()相信大家都不陌生,他就是通過占位符從標準輸入流中格式化的讀取數據然后把數據存儲在參數所指向的位置
1.標準輸入流默認是鍵盤輸入
2.參數就是地址,例如&a這樣
我們來看一個🌰栗子

#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讀取數據時,數據前面的空白字符(空格、制表符以及換行)都會被忽略
好吧以上都不是重點😆,重點是對于字符串的讀取
上星期一道牛客OJ題給阿輝整的汗流浹背(點擊可跳轉)
題目:

輸入描述:
輸入一個字符串,可以有空格輸出描述:
輸出逆序的字符串示例1
輸入
I am a student
輸出
tneduts a ma I

關于這道題的代碼

#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之間的小寫字母,遇到非范圍內的字符停止讀取,當然你也可以用[A-Z]只讀大寫字母,范圍自定義
  • scanf("%[ ^\n ]",str)^\n指的是只讀取非\n的字符包括制表符和空格,遇到換行停止讀取,當然你也可以^\t,都是是自定義的
  • scanf("%*c",str)*指的是對于一個字符類型的數據只讀取但不存儲給任何變量,就是把這個數據從輸入緩沖區去掉這一個操作,也可以%*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		 --第二行

因為第一個scanf只讀取a-z之間的數據,讀到1停止讀取,而1后面還有一個換行,1和換行都還在輸入緩沖區內,因為第二個scanf讀到換行就會停止讀取,因為輸入緩沖區有換行了,你連鍵盤輸入的機會都沒有了,這里\n還留在輸入緩沖區
這里我們對輸入緩沖區的理解應該更加清晰了,scanf從緩沖區讀取數據,輸入緩沖區有適合的數據就不需要你輸入了,就像你飯卡有錢就不用充錢了

如果我們這么寫

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	--第二行

這里第一個scanf里面的%*d%*c1和換行\n給讀取了但并未賦給任何變量,我的理解就是把輸入緩沖區一個有符號數和一個字符給刪掉,然后到第二個scanf的時候輸入緩沖區就沒數據了得我們自己輸入

🚀gets()函數

gets這個函數并不會檢查輸入的長度,可能導致緩沖區溢出,并不建議大家使用,可能出bug,不過gets這個函數還是很猛的。
用法:

char *gets(char *str);
str指向字符數組的指針
返回值,讀取成功為str,讀取錯誤為EOF

gets(str)只能讀取字符包括空格和制表符直到遇到換行符或者文件結束符停止讀取然后將\n從輸入緩沖區刪除,相當于scanf("%[ ^\n ]%*c",str)

🚀getchar()函數

getchar()從鍵盤獲取一個字符,返回值也是這個字符,無參數,直到用戶按下回車鍵或輸入的字符達到了緩沖區的最大長度,停止讀取,一次只讀取一個字符包括空格、換行和制表符,相當于scanf("%c",c)

??清空輸入緩沖區

利用getchar()我們可以寫一個清空輸入緩沖區的函數

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這個函數讀取了,從輸入緩沖區清除了

這里while判斷的條件是getchar != ‘\n’getchar讀取到哪個字符,它的返回值就是哪個字符,所以,這里我們這樣來清空緩沖區,是連帶\n一起清理掉的(當getchar()吸收了’\n’,則getchar() == ‘\n’ ,不滿足條件就退出while循環了)


到這里,阿輝今天對于C語言中的scanf、gets以及getchar分享就結束了,希望這篇博客能讓大家有所收獲, 如果覺得阿輝寫得不錯的話,記得給個贊唄,你們的支持是我創作的最大動力🌹
請添加圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164381.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164381.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164381.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過ros系統中websocket中發送sensor_msgs::Image數據給web端顯示

通過ros系統中websocket中發送sensor_msgs::Image數據給web端顯示 #include <ros/ros.h> #include <signal.h> #include <sensor_msgs/Image.h> #include <message_filters/subscriber.h> #include <message_filters/synchronizer.h> #include &…

spring 是如何開啟事務的, 核心原理是什么

文章目錄 spring 是如何開啟事務的核心原理1 基于注解開啟事務2 基于代碼來開啟事務 spring 是如何開啟事務的 核心原理 Spring事務管理的實現有許多細節&#xff0c;如果對整個接口框架有個大體了解會非常有利于我們理解事務&#xff0c;下面通過講解Spring的事務接口來了解…

建行廣東省江門市分行走進農村地區開展反假貨幣宣傳

人民對美好生活的向往&#xff0c;涉及方方面面&#xff0c;小至“錢袋子”安全。建行廣東省江門市分行落實當地監管部門部署&#xff0c;積極扛起維護國家金融安全的重要政治責任&#xff0c;深入農村地區開展反假貨幣宣傳工作&#xff0c;助力構建農村反假貨幣工作長效機制。…

Hyper-V系列:windows11開啟系統自帶安卓虛擬機并安裝apk包

本文記錄了Windows11系統下開啟系統自帶的安卓虛擬機,并通過安裝包安裝自定義應用的過程。開啟系統自帶的安卓虛擬機流程為:開啟Hyper-V、安裝Windows11子系統;安裝apk安裝包的流程為:安裝adb調試工具、開啟子系統的開發者模式、安裝apk應用包。 一. 開啟Hyper-V Hyper-V…

[BJDCTF2020]The mystery of ip1

提示 ssti模板注入head頭x-forwarded-for 每一次做題的最開始流程都大致因該是 信息收集找可以操控的地方 查看hint頁面的源代碼又發現它提示說 ####你知道為什么會知道你的ip嗎 查看flag頁面 從剛才給我的提示以及他這里顯示的我的ip&#xff0c;大概找到了我可操作的可控點 …

【Vue】創建第一個實例

步驟&#xff1a; 1.創建容器 2.引包 3.創建實例 4.添加配置項 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><!--準備容器 --> <di…

【C語言:深入理解指針二】

文章目錄 1. 二級指針2. 指針數組3. 字符指針變量4. 數組指針變量5. 二維數組傳參的本質6. 函數指針變量7. 函數指針數組8. 轉移表9. 回調函數10. qsort函數的使用與模擬實現 1. 二級指針 我們知道&#xff0c;指針變量也是變量&#xff0c;它也有自己的地址&#xff0c;使用什…

【面試】jvm中堆是分配對象存儲的唯一選擇嗎

目錄 一、說明二、逃逸分析2.1 說明2.2 參數設置 一、說明 1.在《深入理解Java虛擬機》中關于Java堆內存有這樣一段描述:隨著JIT編譯期的發展與逃逸分析技術逐漸成熟&#xff0c;棧上分配、標量替換優化技術將會導致一些微妙的變化&#xff0c;所有的對象都分配到堆上也漸漸變得…

牛客 最小公配數 golang版實現

題目請參考: HJ108 求最小公倍數 題解: 在大的數的倍數里面去找最小的能整除另外一個數的數&#xff0c;就是最小公倍數&#xff0c;按照大的來找&#xff0c;循環次數能夠降到很少&#xff0c;提升效率 golang實現: package mainimport ("fmt" )func main() {a : …

CSDN最新最全python+pytest接口自動化(12)-自動化用例編寫思路 (使用pytest編寫一個測試腳本)

經過之前的學習鋪墊&#xff0c;我們嘗試著利用pytest框架編寫一條接口自動化測試用例&#xff0c;來厘清接口自動化用例編寫的思路。 我們在百度搜索天氣查詢&#xff0c;會出現如下圖所示結果&#xff1a; 接下來&#xff0c;我們以該天氣查詢接口為例&#xff0c;編寫接口測…

JVM 之 class文件詳解

目錄 一. 前言 二. class文件結構 2.1. 文件格式 2.2. 魔數與版本號 2.3. 常量池 2.4. 訪問標志 2.5. 類索引、父類索引和接口索引集合 2.6. 字段表集合 2.7. 方法表集合 2.8. 屬性表集合 2.8.1. Code 屬性表 2.8.2. Exceptions 屬性 2.8.3. LineNumberTable 屬性…

R語言數據縮放-1到1

目錄 普通scale -1到1限定范圍scale 普通scale R語言實戰&#xff1a;scale&#xff08;&#xff09;函數 - 知乎 (zhihu.com) scale(x, center TRUE, scale TRUE) 過程&#xff1a; 對每個變量&#xff08;列&#xff09;計算平均值&#xff08;mean&#xff09;和標準…

QT中樣式表常見屬性與顏色的設置與應用

常見樣式表屬性 在Qt中的樣式表(QSS)中,有一些特定的英文單詞和關鍵字用于指定不同的樣式屬性。以下是常見的一些英文單詞和關鍵字: 顏色(Colors): color: 文本顏色 background-color: 背景顏色 border-color: 邊框顏色 字體(Fonts): font: 字體 font-family: 字體…

任意文件下載漏洞(CVE-2021-44983)

簡介 CVE-2021-44983是Taocms內容管理系統中的一個安全漏洞&#xff0c;可以追溯到版本3.0.1。該漏洞主要源于在登錄后臺后&#xff0c;文件管理欄存在任意文件下載漏洞。簡言之&#xff0c;這個漏洞可能讓攻擊者通過特定的請求下載系統中的任意文件&#xff0c;包括但不限于敏…

python3實現grep命令

由于windows上面沒有類似linux上面的grep命令&#xff0c;所以下面的python腳本來代替其能力。 grep.py import argparse import reif __name__ __main__:arg_parser argparse.ArgumentParser()arg_parser.add_argument("grep")arg_parser.add_argument("fil…

圖像導向濾波

導向濾波&#xff08;Guided Filter&#xff09;是一種基于局部線性模型的濾波方法&#xff0c;用于圖像處理中的去噪、圖像增強和邊緣保留等任務。它結合了引導圖像&#xff08;guide image&#xff09;和輸入圖像來實現對輸入圖像的濾波操作。 原理 數學原理&#xff1a; …

文件名稱管理文件:抓關鍵字歸類文件,讓文件管理變得簡單明了

在當今數字時代&#xff0c;每天都要處理大量的文件&#xff0c;無論是文本、圖片、視頻還是其他類型的文件。如何有效地管理這些文件&#xff0c;能夠迅速找到所需的信息&#xff0c;已經成為了一個重要的問題。文件名稱是文件內容的第一反映&#xff0c;也是識別和檢索文件的…

408-數據結構-代碼題

2014 2014 二叉樹&#xff08;鏈式存儲&#xff09; #include<iostream> #include<bits/stdc.h> using namespace std;typedef struct Node{struct Node *left;struct Node *right;int high0;double weight; }node;double sum0;void visit(node *t){int lop0;if…

算法刷題-動態規劃2(繼續)

算法刷題-動態規劃2 珠寶的最高價值下降路徑最小和使用最小花費爬樓梯整數拆分 珠寶的最高價值 題目 大佬思路 多開一行使得代碼更加的簡潔 移動到右側和下側 dp[ i ][ j ]有兩種情況&#xff1a; 第一種是從上面來的禮物最大價值&#xff1a;dp[ i ][ j ] dp[ i - 1 ][ j ]…

【CCF-PTA】第03屆Scratch第02題 -- 計算天數

計算天數 【題目描述】 一年有 365 天還是有 366 天呢&#xff1f;要看這一年是不是閏年。有個計算方法可以幫助我們判斷&#xff0c;那就是閏年能夠除盡 4 但不能除盡 100 或者能夠除盡 400 的年份。如果這一年是閏年&#xff0c;2 月份的天數就是 29 天。小明決定編寫一個程…