摘要:語言中使用斜杠來表示一個(gè)字符串的結(jié)束。注意事項(xiàng)由于被替換,如果字符串末尾有,換行會(huì)出現(xiàn)兩次。函數(shù)的原型成功返回失敗返回將的字符串錄入到文件指針中。
考慮到之前在專欄中講字符串的時(shí)候有些知識(shí)點(diǎn)沒有詳細(xì)地講解,所以本篇是對(duì)字符串相關(guān)的知識(shí)點(diǎn)的補(bǔ)充篇!例如 %s 輸出左對(duì)齊右對(duì)齊,限制格數(shù)等知識(shí),在那個(gè)專欄的部分代碼中出現(xiàn)了,但只是用注釋簡單的提了下,并沒有詳細(xì)地講,所以本篇將針對(duì)部分遺漏的知識(shí)點(diǎn)進(jìn)行補(bǔ)充和鞏固。本篇通過C語言教材《The C Programming Language》作為參考進(jìn)行講解。
《維生素C語言》 專欄(分別基礎(chǔ)部分和進(jìn)階部分)
? ? ? ? ? ? ? ?【維生素C語言】第十一章 - 字符串函數(shù)與內(nèi)存函數(shù)
① 字符串是連續(xù)排列的字符。
② 因?yàn)樽址拈L度是可變的,所以體現(xiàn)方法也很多樣。
? C語言中使用斜杠0來表示一個(gè)字符串的結(jié)束。
? 為什么需要斜杠0?
① C語言中沒有字符串(String)數(shù)據(jù)類型。
②?C語言使用字符數(shù)組(Char array)來保存字符串。
為了能夠更好地區(qū)分 String 和 Char Array ,我們需要斜杠0。
? 字串串常數(shù)是由大引號(hào)括起來的字符序列(character"s?sequence)
“C is a high-level language”“Hello”
字符串常數(shù)是指針
如果使用字符串常數(shù),C將自動(dòng)生成character數(shù)組并儲(chǔ)存,并返還該數(shù)組的起始地址。
? 所以,可以將字符串上的數(shù)字作為數(shù)組名:
#include int main(void) { printf("%c/n", "Hello"[1]); return 0;}
? 字符常數(shù)是由單引號(hào)標(biāo)出的單個(gè)字符
"a", "b", "c", "1", "2", "3""/0", "/n"
根據(jù)ASCII碼體系分類,對(duì)應(yīng) 0~255:比如 "A" = 65,"/0" = 0
因?yàn)槭钦麛?shù),所以可以進(jìn)行字符常數(shù) + 整數(shù)的整數(shù)運(yùn)算
當(dāng)然,可以用在各種地方:
if( ‘A’ <= c && c <= ‘Z’ )
? 如下圖所示,字符串和字符存儲(chǔ)在內(nèi)存中是有差異的:
因此,儲(chǔ)存字符串常數(shù)時(shí),需要考慮到存放斜杠0的空間。
舉個(gè)例子,為了保存 “Hello” 這個(gè)字,5個(gè)字符 + 斜杠0,總共需要6個(gè)空間。
① 給定數(shù)組大小
② 不給定數(shù)組大小
③ 使用指針
④ 先聲明再用單引號(hào)逐個(gè)輸入
? 字符串初始化時(shí),使用指針和數(shù)組的差異:
char *p = "abcdef";char s[] = "abcdef";
p 作為指針變量有額外的存儲(chǔ)空間,但是 s 只表示數(shù)組的起始地址,它并不是一個(gè)變量。
字符串存儲(chǔ)在數(shù)組中,因?yàn)閿?shù)組名是指針,所以可以利用它輸出下列字符串:
#include int main(void) { char greeting[] = "Hello"; char* ptr; ptr = greeting; while(*ptr != "/0") { printf("%c", *ptr); ptr++; } printf("/n"); return 0;}
??%s 可以從指針的起始地點(diǎn)開始輸出到斜杠零停止
? 我們還可以這么干:
#include int main(void) { char s[] = {"a", "b", "c", "d", "e", "/0"}; printf("從頭開始輸出: %s/n", s); printf("跳過2位后開始輸出: %s/n", s + 2); return 0;}
? 運(yùn)行結(jié)果:
從頭開始輸出:abcde
跳過2位后開始輸出:cde
利用scanf 和printf ,可以進(jìn)行字符串的輸入輸出。
? scanf:
scanf("%s", month);
??輸入長度為9的字符串并保存到數(shù)組中:
char month[10];scanf("%9s", month); // 限制
? 注意事項(xiàng):
用 %s 接收時(shí)無法接收到?blank(“”)、tab(“/ t”)等。
不滿足條件的地方和它后面的部分都會(huì)被無視。
? 利用 scanf 函數(shù)輸入字符串的示例程序
#include int main(void) { char str[10]; char *p; printf("輸入一個(gè)字符串: "); scanf("%9s", str); //限制最多接收9個(gè) p = str; while(*p != "/0") { //利用while讓字符串逐字符輸出 printf("%c", *p); p++; } printf("/n"); return 0;}
? 運(yùn)行測試:
?最多接收9個(gè),所以結(jié)果為 123456789
?證明 %s ,空格會(huì)阻斷。
? 使用 print 函數(shù)打印字符串
和 scanf 一樣,使用 %s 輸出字符串
只輸出 /0 之前的內(nèi)容,所以如果字符串中間有 /0,則后面的內(nèi)容不會(huì)被輸出。
? 利用 printf 函數(shù)輸出字符串的示例程序:
#include int main(void) { printf("|%30s|/n", "This is the string"); printf("|%-30s|/n", "This is the string"); printf("|%-15.14s|/n", "12345678901234567890"); printf("|%15.14s|/n", "12345678901234567890"); return 0;}
? 運(yùn)行結(jié)果:
?
它們和根據(jù)格式輸入的 scanf、fscanf 等不同,gets 和 fgets 是沒有格式的讀入行的函數(shù)。
? gets 函數(shù)的原型:
char* gets(char* strPtr);成功:返回 strPtr 的地址失?。悍祷?NULL
從鍵盤那接收一行,保存到 strptr 中。( /n 之前算作為一行,/n 被置換為 /0”保存)
? 注意事項(xiàng):如果其長度比 strPtr 的長度長,那么 strPtr 后面的內(nèi)存就會(huì)被侵犯,要注意?Segmentation fault 的發(fā)生!
? fgets 函數(shù)的原型:
char* fgets(char* strPtr, int size, FILE *fp);成功:返回 strPtr 的地址失敗,觸尾部(EOF):NULL
從文件指針 FILE* 開始,fp 那里開始讀取一行并保存到 strptr 中。
最大讀取個(gè)數(shù)為 size-1 個(gè)。( /n 之前算作為一行,/n 被置換為 /0”保存)。
在文件指針 FILE* 上設(shè)置 stdin,就可以從鍵盤上輸入了。通常來說,與 gets 函數(shù) 相比我們更建議使用?fgets 函數(shù)。
??fgets 用法演示:
#include int main(void) { char str[81]; printf("請(qǐng)輸入一個(gè)字符串: "); fgets(str, sizeof(str), stdin); printf("你輸入的字符串是:/n/t%s", str); return 0;}
? 運(yùn)行結(jié)果:
不同于按格式輸出?printf 和 fprinf 函數(shù) ,puts 和 fputs 是不格式化直接打印一行的函數(shù)。
? puts?函數(shù)的原型:
int puts (const char *strPtr);成功:返回打印的字符數(shù)(包括被置換成/0的/n)失?。篍OF(-1)
? 將 strPtr 的字符串作為一行輸出到屏幕上。
? 注意事項(xiàng):
① 由于 /0 被 /n 替換,如果字符串末尾有 /n ,換行會(huì)出現(xiàn)兩次。
② 由于只輸出 /0,所以如果字符串中間有 /0,則忽略后面的部分。
? fputs?函數(shù)的原型:
int fputs (const char *strPtr, FILE *fp);成功:返回1失敗:返回EOF(-1)
將 strPtr 的字符串錄入到文件指針 fp 中。
strPtr 必須以 /0 結(jié)尾,并且不會(huì)輸出空字符。
由于只輸出 /0,如果字符串中間有 /0 ,則會(huì)忽略后面的內(nèi)容。
如果將 stdout 提供給文件指針 fp,就可以將其輸出到屏幕上。
gets 函數(shù)與 fgets 函數(shù)有著巨大的差異。
??fputs 用法演示:
#include int main(void) { char str[] = "True Self Is Without From."; char* pStr = str; //指定字符串起始位置 fputs(pStr, stdout); //從頭到尾輸出 fputs("/n", stdout); fputs(pStr + 13, stdout); //從13個(gè)那開始輸出 return 0;}
? 代碼演示:
??fgets / fputs 用法演示
#include int main(void) { char str[81]; while(fgets(str, sizeof(str), stdin) != NULL) { if("A" <= str[0] && str[0] <= "Z") fputs(str, stdout); } return 0;}
參考文獻(xiàn):
Computer Science: A Structured Programming Approach Using C – BEHROUZ. FOROUZAN, RICHARD F.GILBERG
The C Programming Language - Brian W. Kernighan, Dennis M. Ritchie, Practical C Programming - Steve Oualline
本篇完。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/123956.html
摘要:微積分微積分的課程我們也同樣是推薦和的課程。還有一個(gè)斯坦福大學(xué)的統(tǒng)計(jì)學(xué)習(xí)入門英文字幕相當(dāng)不錯(cuò)。所以,除了繪制數(shù)學(xué)圖形外,學(xué)習(xí)數(shù)學(xué)就應(yīng)該完全與編程有機(jī)結(jié)合。 無論是三大數(shù)學(xué)軟件Matlab(通信、控制等工程例外)、Maple、Mathematica,還是三大統(tǒng)計(jì)軟件Spass、Stata、SAS,這些可視化的軟件本身就是編程的一個(gè)體現(xiàn),它們?cè)谝欢ǔ潭壬辖档土宋覀兪褂脭?shù)學(xué)的門檻,但另一方面...
摘要:關(guān)注我,訂閱專欄基礎(chǔ)語言保姆教學(xué),就可以持續(xù)讀到我的文章啦本文為萬字長文,滿滿干貨。那么,上面的代碼所運(yùn)行的結(jié)果就是一維數(shù)組的使用使用即可以訪問并可以修改,即可讀可寫。 大家好~~~我是開心學(xué)編程,學(xué)到無極限的@jxwd? 寫在前面: 各位小伙伴還在為C語言的學(xué)習(xí)而苦惱嘛? 還在為...
摘要:還需注意的一點(diǎn)是,定長數(shù)組,不能與變長數(shù)組相互賦值,我們來看下面的代碼無法編譯已經(jīng)計(jì)劃在未來移除這樣的限制。的變長數(shù)組,可以通過給賦值調(diào)整數(shù)組長度。的變長數(shù)組不支持。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言Solidity教程系列5 - 數(shù)組介紹原文已更新,請(qǐng)讀者前往原文閱讀 Solidity 教程系列第5篇 - Solidity 數(shù)組介紹。Solidity 系列完整的文章...
摘要:實(shí)戰(zhàn)高并發(fā)程序設(shè)計(jì)推薦豆瓣評(píng)分書的質(zhì)量沒的說,推薦大家好好看一下。推薦,豆瓣評(píng)分,人評(píng)價(jià)本書介紹了在編程中條極具實(shí)用價(jià)值的經(jīng)驗(yàn)規(guī)則,這些經(jīng)驗(yàn)規(guī)則涵蓋了大多數(shù)開發(fā)人員每天所面臨的問題的解決方案。 很早就想把JavaGuide的書單更新一下了,昨晚加今天早上花了幾個(gè)時(shí)間對(duì)之前的書單進(jìn)行了分類和補(bǔ)充完善。雖是終極版,但一定還有很多不錯(cuò)的 Java 書籍我沒有添加進(jìn)去,會(huì)繼續(xù)完善下去。希望這篇...
閱讀 1083·2021-11-22 13:52
閱讀 1506·2021-11-19 09:40
閱讀 3348·2021-11-16 11:44
閱讀 1372·2021-11-15 11:39
閱讀 4044·2021-10-08 10:04
閱讀 5518·2021-09-22 14:57
閱讀 3165·2021-09-10 10:50
閱讀 3259·2021-08-17 10:13