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