字元串

来源:http://www.cnblogs.com/mxin/archive/2016/07/15/string.html
-Advertisement-
Play Games

字元串:是以空字元\0為結尾的char數組 在程式中定義字元串的方法 1.字元串常量(字元串文字):是指位於一對雙引號中的任何字元,雙引號里的字元加上編譯器自動提供的結束標誌\0字元,作為一個字元串背儲存在記憶體里。它常常用作printf和puts的參數。 2.字元串數組:定義一個字元串數組時,必須讓 ...


 

字元串:是以空字元\0為結尾的char數組

在程式中定義字元串的方法

1.字元串常量(字元串文字):是指位於一對雙引號中的任何字元,雙引號里的字元加上編譯器自動提供的結束標誌\0字元,作為一個字元串背儲存在記憶體里。它常常用作printf和puts的參數。

2.字元串數組:定義一個字元串數組時,必須讓編譯器知道它需要多大的空間。一種方法是指定以一個足夠大的數組來容納字元串,而通常,讓編譯器決定數組大小更為方便。(在進行初始化聲明時如果省略了數組大小,則其大小由編譯器決定)。

常見的定義字元串的方法

①#define MSG "this is a string"

 

②char msg[50] = "this is a string";         char msg[] = "this is a string";

   const char msg[50] = "this is a string";        const char msg[] = "this is a string"; 

 

③char *msg = "this is a string";     const char *msg = "this is a string";

 

④char *msg[3] = {"this is the first string","this is the second string","this is the third string"};

   const char *msg[3] = {"this is the first string","this is the second string","this is the third string"};

 

字元串常量屬於靜態存儲類,即使多次使用了字元串常量,該字元串在程式的整個運行過程中只存儲一份。整個引號中的內容作為指向該字元串存儲位置的指針。這一點與把數組名作為指向數組存儲位置的指針類似,即把字元串看作指針。

例如:對於字元串“We are the champion”,

若在printf中用%s輸出,則輸出引號中所有內容,即“We are the champion”。

若以%p輸出,則輸出的使字元串中第一個字元的地址,此處即'W'的地址。

若以%c輸出*”We are the champion“,則輸出字元串“We are the champion”中的第一個字元,此處即W。因為“We are the champion”是地址,等於該字元串第一個字元(W)的地址,故*“We are the champion”的值即為該地址中的值,即W。

 

比較char *msg和char msg[]

在數組形式中,msg是個地址常量。您不能更改msg,因為這意味著更改數組存儲的位置(地址)。

可以實用msg+1來表示數組裡的下一個元素(==msg[1]),但是不允許實用++msg或msg++,因為增量運算符只能用在變數名前,而此處msg使個地址常量。

在指針形式中,msg指向字元串的第一個字元,它的值使可以變的。因此可以對他使用增量運算符。例如,++msg將指向第二個字元。

總之,數組初始化是從靜態存儲區把要給字元串複製給數組,而指針初始化只是賦值字元串的地址(==字元串第一個字元的地址)。

 

比較char *msg[SIZE]和char (*msg)[SIZE]

表達式中[]的優先順序高於*,因此圓括弧的有無會造成很大不同。

 

char *msg[SIZE]表示msg是一個包含SIZE個元素的數組,而數組中的每個元素都是一個指向char值的指針。該種形式可以用來聲明一個字元串數組。

msg數組中存放的是字元串的地址,而實際上字元串存在於程式用來存放常量的那部分記憶體中。可以把msg[0]看作指向第一個字元串開始的指針,*msg[0]表示第一個字元串的第一個字元,由於數組符號和指針之間的關係,它等價於msg[0][0],儘管msg並沒有被定義成二維數組

 

char (*msg)[SIZE]表示msg首先是一個指針,它指向的是一個包含SIZE個char值的數組,該種形式可以用來聲明指向二維數組的指針變數。

 

字元串的輸入

如果想把字元串讀到程式中,必須首先預留存儲字元串的空間,然後使用輸入函數來獲取這個字元串。

創建存儲空間的方法

1.利用char數組,需要分配足夠大的存儲區來存放希望讀入的字元串,需要在聲明中明確指出數組大小。例如,char msg[50];

2.利用C庫里分配存儲空間的函數。例如,char *ptd;  ptd = (char *) malloc (SIZE * sizeof(char));這段代碼請求SIZE個char類型值的空間,並且把ptd指向該空間所在位置。

輸入函數

gets()函數,它讀取換行符之前(不包括換行符)所有字元,在這些字元後添加一個空字元\0,然後把這個字元串交給調用它的程式。它使用一個地址作為參數,可以使數組名,也可以是初始化過的(已分配記憶體的)指針。如果遇到文件結尾,gets就返回空指針NULL。

註意,gets不檢查目標數組是否能夠容納輸入!常見形式為:char name[50]; gets(name);

 

fgets()函數,它需要您指定最大輸入字元數和讀哪個文件(鍵盤為stdin)。如果這個參數值為n,fgets就會讀取最多n-1個字元或者讀完一個換行符為止,由這二者中最先滿足的那個來結束輸入。它讀取到換行符,不會像gets那樣丟棄,而是存儲到字元串里。常見形式:char name[50]; fgets(name,50,stdin);

 

scanf()函數,更基於獲取單詞而不是字元串。它以%s格式讀取,以遇到的第一個非空白字元開始,讀到(但不包括)下一個空白字元。如果指定了欄位寬度如%10s,則會讀取10個字元或者直到遇到第一個空白字元,由二者中最先滿足的那個中只輸入。常見形式:char name[50]; scanf("%s",name);

 

輸出函數

puts()函數,其參數為字元串的地址,它會在顯示字元串時自動在其後添加一個換行符。

常見形式:puts(name);   puts("this is a string!");

 

fputs()函數,它是puts面向文件版本,需要第二個參數來說明要寫的文件,且fputs不為輸出自動添加換行符。

常見格式:fputs(name,stdout);

 

printf()函數,它沒有puts那麼方便,但是它可以格式化多種數據類型,因而更通用。它使得在一行上輸出多個字元串變得更為簡單。

常見形式:printf("Well,%s %s\n",name,MSG);

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • sphinx是國外的一款搜索軟體。 coreseek是在sphinx的基礎上,增加了中文分詞功能,換句話說,就是支持了中文。 Coreseek發佈了3.2.14版本和4.1版本,其中的3.2.14版本是2010年發佈的,它是基於Sphinx0.9.9搜索引擎的。而4.1版本是2011年發佈的,它是基 ...
  • 最近自己通過視頻與相關書籍的學習,對action裡面接收參數做一些總結與自己的理解,希望各位技術大牛們能多多指教。 0.0、接收參數的(主要)方法 1.1、使用Action的屬性接收參數 本文以最簡單的表單提交為例: 1.1.1.建立login.jsp頁面 1.1.2.創建loginAction 註 ...
  • /*String類用於描述字元串事物的那麼它就提供了多個方法對字元串進行操作方法都會用,字元串這塊就結束了常見的操作有哪些?“abcd”它應該具備什麼功能,我們才能更好得操作它?1.獲取(必須要掌握) 1.1 字元串中包含的字元數,也就是字元串的長度 int length() 然而數組也有長度,數組 ...
  • 看到成員變數和局部變數同名這個知識點的時候一開始有點懵逼,想了一下其實特別簡單。 先來看一個簡單的代碼。 首先我定義了一個Person類。 然後在主函數裡面創建對象並輸出。 輸出結果是什麼?並不是我們想象的我的年齡是20,而是下麵這樣: 想一下其實就很容易理解。 一句話,如果不同名,那麼方法內的變數 ...
  • 快速排序: 1、從數組中隨便選出一個數(其實一般用第一個數)作為本次迴圈的比較基數,然後走一趟,把所有比基數小的數放在該基數的左邊,把大於該基數的數放在該基數的右邊(排序結果有小到大,反之反之)。 (該基數在數組中的腳標是變動的,不要考慮比該基數小(大)的數較多,在其左(右)邊放不下的弱智腦殘問題) ...
  • 面向對象的概述 面向對象的概念在我理解來,函數是對代碼的封裝,而類和對象是對函數的封裝,其優點如下 面向過程:根據業務邏輯從上到下寫壘代碼 函數式:將某功能代碼封裝到函數中,日後便無需重覆編寫,僅調用函數即可 面向對象:對函數進行分類和封裝,讓開發“更快更好更強... 面向對象編程是一種編程方式,此 ...
  • 一、基於 XML 的 Bean 的配置 1.通過屬性註入 即通過 setXxx() 方法註入 Bean 的屬性值或依賴的對象。 使用 <property name="" value="" ref=""/> 元素,其中 name 值為對應 Bean 屬性名稱,value 指定對應屬性值,ref 引用其 ...
  • 一、學習版本 spring-framework-4.0.0 二、導入 jar 包: 三、在類路徑下創建 Spring Config 文件:ApplicationContext.xml 四、創建一個非侵入的 Bean 五、在 Spring Config 文件中配置該 Bean 六、通過 IOC 容器對 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...