国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【C語言】C語言字符串 | 關于String | 通過國外教材講解字符串 | 專欄遺漏知識點補充

trigkit4 / 1440人閱讀

摘要:語言中使用斜杠來表示一個字符串的結束。注意事項由于被替換,如果字符串末尾有,換行會出現兩次。函數的原型成功返回失敗返回將的字符串錄入到文件指針中。

前言:

考慮到之前在專欄中講字符串的時候有些知識點沒有詳細地講解,所以本篇是對字符串相關的知識點的補充篇!例如 %s 輸出左對齊右對齊,限制格數等知識,在那個專欄的部分代碼中出現了,但只是用注釋簡單的提了下,并沒有詳細地講,所以本篇將針對部分遺漏的知識點進行補充和鞏固。本篇通過C語言教材《The C Programming Language》作為參考進行講解。

《維生素C語言》 專欄(分別基礎部分和進階部分)

? ? ? ? ? ? ? ?【維生素C語言】第十一章 - 字符串函數與內存函數


0x00 字符串概念(String concepts)

① 字符串是連續排列的字符。

② 因為字符串的長度是可變的,所以體現方法也很多樣。

? C語言中使用斜杠0來表示一個字符串的結束。

0x01 斜杠0(The String Delimiter)

? 為什么需要斜杠0?

① C語言中沒有字符串(String)數據類型。

②?C語言使用字符數組(Char array)來保存字符串。

為了能夠更好地區分 String 和 Char Array ,我們需要斜杠0。

0x02 字符串常數(String Literals & String Constant)

? 字串串常數是由大引號括起來的字符序列(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’ )

0x03 存儲(Storing Strings and Characters)

? 如下圖所示,字符串和字符存儲在內存中是有差異的:

因此,儲存字符串常數時,需要考慮到存放斜杠0的空間。

舉個例子,為了保存 “Hello” 這個字,5個字符 + 斜杠0,總共需要6個空間。

0x04 字符串初始化的四種方法

① 給定數組大小

② 不給定數組大小

③ 使用指針

④ 先聲明再用單引號逐個輸入

? 字符串初始化時,使用指針和數組的差異:

char *p = "abcdef";char s[] = "abcdef";

p 作為指針變量有額外的存儲空間,但是 s 只表示數組的起始地址,它并不是一個變量。

0x05 字符串和指針(Strings and Pointers)

字符串存儲在數組中,因為數組名是指針,所以可以利用它輸出下列字符串:

#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

0x06 字符串輸入輸出函數 String input/output function

利用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;}

? 運行結果:

?

0x07 gets / fgets 函數

它們和根據格式輸入的 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;}

? 運行結果:

0x09 puts / fputs 函數

不同于按格式輸出?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

相關文章

  • 數學與Python有機結合及統計學、微積分、線性代數相關資源、圖形軟件

    摘要:微積分微積分的課程我們也同樣是推薦和的課程。還有一個斯坦福大學的統計學習入門英文字幕相當不錯。所以,除了繪制數學圖形外,學習數學就應該完全與編程有機結合。 無論是三大數學軟件Matlab(通信、控制等工程例外)、Maple、Mathematica,還是三大統計軟件Spass、Stata、SAS,這些可視化的軟件本身就是編程的一個體現,它們在一定程度上降低了我們使用數學的門檻,但另一方面...

    Java3y 評論0 收藏0
  • 0基礎C語言保姆教學——第五節 數組

    摘要:關注我,訂閱專欄基礎語言保姆教學,就可以持續讀到我的文章啦本文為萬字長文,滿滿干貨。那么,上面的代碼所運行的結果就是一維數組的使用使用即可以訪問并可以修改,即可讀可寫。 大家好~~~我是開心學編程,學到無極限的@jxwd? 寫在前面: 各位小伙伴還在為C語言的學習而苦惱嘛? 還在為...

    RobinQu 評論0 收藏0
  • 智能合約語言Solidity教程系列5 - 數組介紹

    摘要:還需注意的一點是,定長數組,不能與變長數組相互賦值,我們來看下面的代碼無法編譯已經計劃在未來移除這樣的限制。的變長數組,可以通過給賦值調整數組長度。的變長數組不支持。 本文首發于深入淺出區塊鏈社區原文鏈接:智能合約語言Solidity教程系列5 - 數組介紹原文已更新,請讀者前往原文閱讀 Solidity 教程系列第5篇 - Solidity 數組介紹。Solidity 系列完整的文章...

    draveness 評論0 收藏0
  • Java學習必備書籍推薦終極版!

    摘要:實戰高并發程序設計推薦豆瓣評分書的質量沒的說,推薦大家好好看一下。推薦,豆瓣評分,人評價本書介紹了在編程中條極具實用價值的經驗規則,這些經驗規則涵蓋了大多數開發人員每天所面臨的問題的解決方案。 很早就想把JavaGuide的書單更新一下了,昨晚加今天早上花了幾個時間對之前的書單進行了分類和補充完善。雖是終極版,但一定還有很多不錯的 Java 書籍我沒有添加進去,會繼續完善下去。希望這篇...

    Steve_Wang_ 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<