色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

字符串的輸入輸出及相關函數(shù)

AGk5_ZLG_zhiyua ? 來源:未知 ? 作者:佚名 ? 2017-09-14 11:52 ? 次閱讀

周立功教授數(shù)年之心血之作《程序設計與數(shù)據(jù)結(jié)構》,電子版已無償性分享到電子工程師與高校群體,在公眾號回復【程序設計】即可在線閱讀。書本內(nèi)容公開后,在電子行業(yè)掀起一片學習熱潮。經(jīng)周立功教授授權,本公眾號特對本書內(nèi)容進行連載,愿共勉之。

第一章為程序設計基礎,本文為1.8.2 字符串常量第二點:字符串的輸入輸出。

(1)scanf()函數(shù)和gets()函數(shù)

scanf()函數(shù)

在讀取字符串時,scanf()和轉(zhuǎn)換格式符%s只能讀取一個單詞,比如:

scanf("%s\n", str);

在scanf函數(shù)調(diào)用中,不需要在str前添加&,因為str是數(shù)組名,編譯器在將它傳遞給函數(shù)時,會將它當作指針來處理。調(diào)用時,scanf函數(shù)會跳過空字符,然后讀入字符并存儲到str中,直到遇到空字符為止,scanf函數(shù)始終會在字符串末尾存儲一個空字符。

gets()函數(shù)

在程序中經(jīng)常要讀取一整行輸入,而不僅僅是一個單詞,gets()就是用于處理這種情況的。它讀取整行輸入直至遇到換行符,然后丟棄換行符存儲其余字符,并在這些字符的末尾添加一個空字符使其成為一個字符串。它經(jīng)常和puts()配對使用,該函數(shù)用于顯示字符串,并在末尾添加換行符。即gets()是從標準輸入設備中輸入若干個字符,并保存到參數(shù)s指向的字符數(shù)組中,直到文件結(jié)束或讀到一個換行符。換行符將被丟棄,在輸入最后一個字符后會立即寫入一個結(jié)束符'\0'。其函數(shù)原型如下:

char *gets(char *s);

其中的s指向保存輸入字符串的內(nèi)存空間,如果gets()成功地獲得了字符串,則返回s,否則返回NULL。比如,通過命令行輸入一個字符'9',但'9'不是整數(shù)9,如果將'9'-'0',則會得到整數(shù)9。即:

char cStr[256];

int cmdNum;

cmdNum = getchar() - '0';

gets(cStr); //清空緩沖區(qū)

如果將數(shù)組作為參數(shù)傳遞,則傳遞的是指向數(shù)組首元素的指針,當gets()作為被調(diào)用函數(shù)時,則完全不知道數(shù)組究竟有多大,而調(diào)用者又不能向gets()傳遞緩沖區(qū)的大小,因此gets()無法檢查數(shù)組的長度。顯然必須有足夠的空間保存輸入的字符串,否則可能出現(xiàn)莫名其妙的問題。如果你故意將尺寸很大的數(shù)據(jù)傳遞給gets(),就可以達到數(shù)組越界且改寫返回地址的目的。1988年名震互聯(lián)網(wǎng)的“互聯(lián)網(wǎng)蠕蟲”病毒,就是利用了gets()的這個弱點。

由于gets()的不安全行為造成了隱患,因此制定C11標準的委員采取了強硬的態(tài)度,直接從標準中廢除了gets()函數(shù)。不妨自己編寫一個輸入函數(shù),假設函數(shù)不會跳過空字符,在第一個換行符(不存儲到字符串中)處停止讀取,且忽略額外的字符。其函數(shù)原型如下:

int readLine(char str[], int n);

readLine()函數(shù)主要由一個循環(huán)構成,只要str中還有空間,此循環(huán)就會調(diào)用getchar()函數(shù)逐個讀入字符并將它存儲在str中,在讀入換行符時循環(huán)終止,詳見程序清單 1.40。

程序清單 1.40 readLine()函數(shù)的實現(xiàn)

1 int readLine(char str[], int n)

2 {

3 int ch, i = 0;

4

5 while((ch = getchar()) != '\n')

6 if(i < n)

7 str[i++] = ch;

8 str[i] = '\0';

9 return 0;

10 }

(2)printf()函數(shù)和puts()函數(shù)

printf()函數(shù)

轉(zhuǎn)換格式符s%允許printf()寫字符串,與puts不同的是,printf()不會自動地在每個字符串的末尾加上一個換行符,因此必須在參數(shù)中指明應該在哪里使用換行符。比如:

char str[] = "hello world";

printf("%s\n", str);

printf()會逐個寫字符串中的字符,直到遇到空字符為止。如果只想顯示字符串的一部分,可以使用轉(zhuǎn)換格式符%.ps,這里的p是顯示的字符數(shù)量。比如,顯示hello:

printf("%.5s\n", str);

puts()函數(shù)

雖然printf()用起來比較復雜,但可以打印多個字符串。除了printf(),C標準庫還提供了puts(),其函數(shù)原型如下:

int puts(const char *s);

其中,s為指定輸出的字符串,puts()函數(shù)將參數(shù)s指向的字符串輸出到標準輸出設備中,但不輸出結(jié)束符'\0'。在輸出字符串后,puts()函數(shù)會多輸出一個換行符'\n',然后通過標準輸出設備顯示指定的字符串。如果顯示成功,則返回0,否則返回預定義常量EOF。puts()如何知道在何處停止呢?該函數(shù)在遇到空字符時就停止輸出,所以必須確保有空字符。

(3)fgets()函數(shù)和fputs()函數(shù)

fgets()函數(shù)

fgets()和fputs()分別是gets()和puts()針對文件的定制的版本,fgets()通過第2個參數(shù)限制讀入的字符數(shù)來解決溢出的問題,該函數(shù)專門用于處理文件輸入。如果第2個參數(shù)的值是n,那么fgets()將讀入n-1個字符,或遇到第1個換行符為止。如果讀到一個換行符將它存儲在字符串中,這點與gets()不同,gets()會丟棄換行符。

fgets()的第1個參數(shù)與gets()一樣,也是存儲輸入位置的地址(char *類型),第2個參數(shù)是一個整數(shù),表示待輸入字符串的大小,最后一個參數(shù)是文件指針,指定待讀取文件。如果讀入從鍵盤輸入的數(shù)據(jù),則以標準輸入stdin作為參數(shù),該標識定義在stdio.h中。其調(diào)用示例如下:

fgets(buf, STLEN, fp);

其中,buf是char類型數(shù)組的名稱,STLEN是字符串的大小,fp是指向FILE的指針。以上面的gets()為例,fgets()讀取輸入直到第1個換行符的后面,或讀到文件結(jié)尾,或讀取STLEN-1個字符,然后fgets()在末尾添加一個空字符使之成為一個字符串,字符串的大小是其字符數(shù)加上一個空字符。如果fgets()在讀到字符上限之前已經(jīng)讀完一整行,它會將表示行結(jié)尾的換行符放在空字符前面。fegts()在遇到EOF時將返回NULL,因此可以利用這一機制檢查是否到達文件結(jié)尾。如果未遇到EOF,則返回它的地址。

fgets()存儲換行符有好處也有壞處,壞處是你可能不想將換行符存儲在字符串中,這樣的換行符會帶來一些麻煩。好處是對于存儲的字符串而言,檢查末尾是否有換行符可以判斷是否讀取了一整行。如果不是一整行,則要妥善處理一行中剩下的字符。

首先,如何處理換行符?一個方法是在已經(jīng)存儲的字符串中查找換行符,并將其替換成空字符。假設\n在st中:

while(st[i] != '\n' )

i++;

st[i] = '\0';

其次,如果仍有字符串留在輸入行怎么辦?一個可行的辦法是,如果目標數(shù)組裝不下一整行輸入,就丟棄那些多出的字符。即讀取但不存儲輸入,包括\n:

while(getchar() != '\0')

continue;

為何要丟棄輸入行中余下的字符?因為輸入行中多出來的字符會留在緩沖區(qū)中,成為下一次讀取語句的輸入。比如,如果下一條讀取語句要讀取的是double類型的值,就可能導致程序崩潰,而丟棄輸入行余下的字符是為了保證讀取語句與鍵盤輸入同步。既然沒有這樣的函數(shù),那么就創(chuàng)建一個,s_gets()函數(shù)詳見程序清單 1.41。

程序清單1.41 s_gets()函數(shù)

1 char * s_gets(char *st, int n)

2 {

3 char *ret_value;

4 int i = 0;

5

6 ret_value = fgets(st, n, stdin);

7 if(ret_value){

8 while(st[i] != '\n' && st[i] != '\0')

9 i++;

10 if(st[i] == '\n')

11 st[i] = '\0';

12 else

13 while(getchar() != '\0')

14 continue;

15 }

16 return ret_value;

17 }

如果fgets()返回NULL,說明讀到文件結(jié)尾或出現(xiàn)讀取錯誤,s_gets()跳過了這個過程。其中的循環(huán):

while(st[i] != '\n' && st[i] != '\0')

i++;

遍歷字符串,直到遇到換行符或空字符。如果先遇到換行符,下面的if語句將其替換成空字符;如果先遇到空字符,else部分便丟棄輸入行的剩余字符,然后返回與fgets()相同的值。

盡管s_gets()用于替換fgets()已經(jīng)有了很大的改進,但還是不完美。如果遇到不合適的輸入時,它毫無反應。它丟棄多余的字符時,也不通知程序也不告知用戶,請讀者完善。

fputs()函數(shù)

由于fgets()將換行符放在字符串的末尾(假設輸入行不溢出),通常要與fputs()配對使用,除非該函數(shù)不在字符串末尾添加換行符。

fputs()函數(shù)接受兩個參數(shù):第1個是字符串的地址,第2個是文件指針,指明要寫入的文件,該函數(shù)根據(jù)傳入地址找到的字符串寫入指定的文件中。如果要顯示在計算機顯示器上,應使用標準輸出stdout作為參數(shù)。和puts()不同的是,puts()在打印字符串時,不會在其末尾添加換行符。其調(diào)用示例如下:

fputs(buf, fp);

其中,buf是字符串的地址,fp用于指定目標文件。注意,gets()丟棄輸入中的換行符,但puts()在輸出中添加換行符。而另一方面,fgets()保留了輸入中的換行符,fputs()在輸出中不會添加換行符。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 字符串
    +關注

    關注

    1

    文章

    585

    瀏覽量

    20577

原文標題:周立功:字符真正價值在于形成字符序列——字符串的輸入輸出

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    字符串函數(shù)測試學習工程

    字符串函數(shù)測試學習工程
    發(fā)表于 07-01 16:38 ?6次下載

    Labview之字符串長度函數(shù)

    Labview之字符串長度函數(shù),很好的Labview資料,快來下載學習吧。
    發(fā)表于 04-19 10:43 ?0次下載

    C語言的字符串處理函數(shù)

    指針是神奇的,指向整型的指針int *p1,可以操作整型數(shù)組int a[];指向字符型的指針char *p2,可以操作字符數(shù)組(字符串)char str[];更靈活的是,在函數(shù)的傳遞中
    發(fā)表于 07-24 17:37 ?4次下載
    C語言的<b class='flag-5'>字符串</b>處理<b class='flag-5'>函數(shù)</b>

    LabVIEW的常用字符串操作教程免費下載

    字符串操作與信息的保存和顯示密不可分,而字符串操作運用也是LabⅥEW程序設計的一個難點,因此熟練使用字符串操作函數(shù)是使用LabⅥEW進行編程所必備的能力之
    發(fā)表于 08-21 14:51 ?26次下載
    LabVIEW的常用<b class='flag-5'>字符串</b>操作教程免費下載

    C語言編程字符串函數(shù)匯總資源下載

    C語言編程字符串函數(shù)匯總資源下載
    發(fā)表于 04-15 16:18 ?9次下載
    C語言編程<b class='flag-5'>字符串</b><b class='flag-5'>函數(shù)</b>匯總資源下載

    C語言輸入輸出

    不對的地方請指出。1. 標準輸入輸出函數(shù)getchar():讀入一個字符 putchar():輸出一個字符 gets():讀
    發(fā)表于 12-14 18:52 ?3次下載
    C語言<b class='flag-5'>輸入輸出</b>

    字符串函數(shù)重寫練習

    字符串函數(shù)重寫練習:字符串比較、字符串拼接、字符串查找、字符串拷貝、內(nèi)存比較、內(nèi)存拷貝、內(nèi)存初始
    的頭像 發(fā)表于 05-05 15:02 ?2019次閱讀

    C語言總結(jié)_字符串函數(shù)封裝練習

    字符串函數(shù)重寫練習:字符串比較、字符串拼接、字符串查找、字符串拷貝、內(nèi)存比較、內(nèi)存拷貝、內(nèi)存初始
    的頭像 發(fā)表于 08-14 09:42 ?1030次閱讀

    python字符串有哪些特定方法

    python字符串序列操作也適用于列表和元組。 python字符串還有獨有方法,即字符串對象的函數(shù),其他對象不可調(diào)用,只有字符串對象可
    的頭像 發(fā)表于 02-23 15:02 ?737次閱讀

    字符串相關知識

    TCL 中的數(shù)據(jù)類型只有一種:字符串。這些字符串可以是字母、數(shù)字、布爾值、標點符號等特殊字符的組合。在某些特殊命令的作用下,字符串可以向其他數(shù)據(jù)類型轉(zhuǎn)換。下面將系統(tǒng)的講解或回顧下
    的頭像 發(fā)表于 03-29 11:41 ?1181次閱讀

    MySQL替換字符串函數(shù)REPLACE

    MySQL是目前非常流行的開源數(shù)據(jù)庫管理系統(tǒng)之一,它具有強大的功能和性能。其中之一的字符串函數(shù)REPLACE,可以用于替換字符串中的指定字符字符串
    的頭像 發(fā)表于 11-30 10:44 ?1606次閱讀

    oracle中拼接字符串函數(shù)

    在Oracle中,我們可以使用 CONCAT 函數(shù)來拼接字符串。CONCAT 函數(shù)接受兩個參數(shù),它將這兩個參數(shù)連接起來并返回相應的字符串結(jié)果。 語法示例: CONCAT(string1
    的頭像 發(fā)表于 12-06 09:49 ?2998次閱讀

    labview中常用的字符串函數(shù)有哪些?

    在LabVIEW中,常用的字符串函數(shù)廣泛覆蓋了對字符串的各種操作,包括但不限于格式化、搜索、替換、連接、計算長度等。以下是一些常用的字符串函數(shù)
    的頭像 發(fā)表于 09-04 15:43 ?936次閱讀

    labview字符串如何轉(zhuǎn)換為16進制字符串

    在LabVIEW中,將字符串轉(zhuǎn)換為16進制字符串是一個常見的需求,尤其是在處理數(shù)據(jù)通信和硬件接口時。LabVIEW提供了多種方法來實現(xiàn)這一轉(zhuǎn)換,包括使用內(nèi)置函數(shù)、編寫VI(Virtual
    的頭像 發(fā)表于 09-04 15:54 ?2938次閱讀

    字符串在編程中的應用實例

    字符串在編程中有著廣泛的應用,它們被用于表示文本數(shù)據(jù)、處理用戶輸入、構建動態(tài)內(nèi)容等。以下是一些字符串在編程中的應用實例: 1. 用戶輸入輸出
    的頭像 發(fā)表于 01-07 15:33 ?133次閱讀
    主站蜘蛛池模板: 欧美人成在线观看ccc36 | 久久综合久综合久久鬼色 | 国产成人高清亚洲一区app | 欧美日韩亚洲成人 | 亚洲国产免费观看视频 | 伊人草| 伊人久久大香线蕉综合网站 | 国产亚洲精品久久久久久国 | 精品国产人成亚洲区 | 中文字幕高清在线观看 | 亚洲色t图 | 国产成人免费手机在线观看视频 | 国产精品久免费的黄网站 | 97成人在线视频 | 亚洲国产在线播放在线 | 99久久免热在线观看6 | 日韩精品免费一区二区 | 亚洲国产av | 97精品国偷拍自产在线 | 综合色就爱涩涩涩综合婷婷 | 国产精品AV色欲蜜臀在线 | 女教师苍井空体肉女教师S242 | 国产中文字幕在线 | 国产精品自在拍在线播放 | 一本二卡三卡四卡乱码麻豆 | 亚洲AV 无码AV 中文字幕 | 涩涩视频在线看 | 2021国产精品一卡2卡三卡4卡 | 国产亚洲精品久久综合阿香 | 先锋影音av最新资源网 | 我们中文在线观看免费完整版 | 20岁αsrian男同志免费 | 久久久久久极精品久久久 | 色色色五的天 | 亚洲国产精品一区二区三区在线观看 | 久久只有这里有精品4 | 亚洲一区免费观看 | 羽月希被黑人吃奶dasd585 | 久久精品国产午夜伦班片 | 精品国产国产精2020久久日 | 国产午夜人成在线视频麻豆 |