char string 區別

来源:https://www.cnblogs.com/ycbeginner/archive/2018/07/26/9362481.html
-Advertisement-
Play Games

由於在C++項目中,經常遇到處理字元方面的問題,故藉此機會整理一下,讓自己對於char , string 等有進一步的瞭解。 基本概念 由單引號括起來的一個字元成為char型字面值。雙引號括起來的零個或多個字元則構成字元串型字面值。 字元串字面值得類型=>由常量字元構成的數組,併在結尾處添加一個空字 ...


由於在C++項目中,經常遇到處理字元方面的問題,故藉此機會整理一下,讓自己對於char , string 等有進一步的瞭解。

  • 基本概念

由單引號括起來的一個字元成為char型字面值。雙引號括起來的零個或多個字元則構成字元串型字面值。

'a' // 字元字面值
"Hello World!"//字元串字面值

  字元串字面值得類型=>由常量字元構成的數組,併在結尾處添加一個空字元('\0');因此字元串字面值的實際長度比它的內容多1。

'A'//單獨的字元A
"A"//包含兩個字元,一個字母A,一個空字元。
  • C標準庫String函數
strlen(p) 返回p的長度,空字元不計算在內,傳入此類函數的指針必須紙箱以空字元作為結束的數組
strcmp(p1,p2)

比較p1和p2的相等性。如果p1 == p2,返回0;如果p1>p2,返回一個正值;如果p1<p2,返回一個負值。

傳入此類函數的指針必須紙箱以空字元作為結束的數組。

strcat(p1,p2) 將p2附加到p1之後,返回p1;傳入此類函數的指針必須紙箱以空字元作為結束的數組
strcpy(p1,p2) 將p2拷貝給p1,返回p1;傳入此類函數的指針必須紙箱以空字元作為結束的數組

 

 

 

 

 

 

char ca [] = {'C', '+', '+'};   //不以空字元結束
cout << strlen(ca)<<endl;   //錯誤,ca沒有以空字元結束

當使用數組的時候,其實真正用的是指向數組首元素的指針。

混用string對象和C風格字元串

  1. 允許使用以空字元結束的字元數組來初始化string對象或為string對象賦值;
  2. 在string對象的加法運算中允許使用以空字元結束的字元數組作為其中一個運算對象(不能兩個運算對象都是);在string對象的複合賦值運算中允許使用以空字元結束的字元數組作為右側的運算對象。

上述返過來就不行,如下:

不能用string對象直接初始化指向字元的指針。為此,string提供了c_str的成員函數,來實現此效果。

string s("Hello World"); //可以,s內容是 Hello World
char * str = s; //錯誤
const char *str = s.c_str(); //正確 ,註意是 const char *

c_str函數返回結果是一個指針,指向一個以空字元結束的字元數組,而這個數組所存的數據恰好與那個string對象的一樣。結果指針的類型是const char *,從而確保我們不會改變字元數組的內容。

註意:c_str()返回的數組無法保證一直有效,如果後續的操作改變了s的值,就可能讓之前返回的數組失效。

如果執行完c_str()函數後程式想一直都能使用其返回的數組,最好將該數組重新拷貝一份。

  • 標準庫類型 String

標準庫string表示可變長的字元序列,首先要包含string頭文件,且string定義在命名空間std中。

string s1 ;//預設初始化,s1是一個空串
string s2(s1);   // s2 是 s1 的副本
string s2 = s1; // 等價於s2(s1),s2 是s1的副本
string s3("value") ;//s3是字面值value的副本,不過沒有後面的那個空字元
string s3 = "value";//等價於s3("value"),s3 是字面值"value"的副本。
string s4(n,'c'); // 把s4初始化為由連續n個字元c組成的串。

有關標準類型String對象上的操作有s.size()  s.empty() s1+s2 s1 = s2 s[n] s1==s2  < <= > >= !=

  • 數組方面

字元數組的特殊性:它有一種額外的初始化形式,可以用字元串字面值對此類數組初始化。

char a1[] = {'C', '+', '+'};//列表初始化,沒有空字元
char a2[] = {'C', '+', '+','\0'}; // 列表初始化,含有顯式的空字元
char a3[] = "C++" ;//會自動添加表示字元串結束的空字元
const char a4[6] = "Daniel"; //錯誤,沒有空間可存放空字元

string 類型數組: 

string a4[3] = {"hi","bye"};//等價於a4[] = {"hi","bye",""};

在C語言中,可以使用以下方式:

char *str ="hello world"; //但是這種方式在IOS C++11 運行下不行。

C語言有兩種表示字元串的方法,一種是字元數組,另一種是字元串常量,它們在記憶體中的存儲位置不同,使得字元數組可以讀取和修改,而字元串常量只能讀取不能修改。

#include <stdio.h>
int main(){
    char *str = "Hello World!";
    str = "I love C!";  //正確
    str[3] = 'P';  //錯誤

    return 0;
}

在編程過程中如果只涉及到對字元串的讀取,那麼字元數組和字元串常量都能夠滿足要求;如果有寫入(修改)操作,那麼只能使用字元數組,不能使用字元串常量。

這兩種方式(字元數組和字元串指針)它們最根本的區別是在記憶體中的存儲區域不一樣,字元數組存儲在全局數據區或棧區,第二種形式的字元串存儲在常量區。全局數據區和棧區的字元串(也包括其他數據)有讀取和寫入的許可權,而常量區的字元串(也包括其他數據)只有讀取許可權,沒有寫入許可權。

還有一點需要註意,就是當用到sizeof時:

char *str1 = "hello wrold";
char str2[] = "hello world";
cout<<sizeof(str1);   //8      機子是64位
cout << sizeof(str2);  //12

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 前言 CountDownLatch是一個閉鎖實現,它可以使一個或者多個線程等待一組事件發生。它包含一個計數器,用來表示需要等待的事件數量,coutDown方法用於表示一個事件發生,計數器隨之遞減,而await方法等待計數器為0之前一直阻塞。它是基於AQS的共用鎖來實現的,其中使用了較多的AQS的方法 ...
  • 1、作用域public,private,protected,以及不寫時的區別 答:區別如下: 作用域 當前類 同一package 子孫類 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × × 不寫時預設 ...
  • 網關服務的作用: 身份認證、路由服務、為前端服務的後端—數據聚合 身份認證 如果我們的微服務和終端通信,勢必要考慮身份認證,如果我們的微服務都與每個終端用戶打交道,那麼這些代碼就需要拷貝多份, 並且植入到每個微服務業務代碼中,這就造成業務代碼和身份認證代碼耦合,降低代碼的復用性。 路由服務 由運維人 ...
  • DVWA列出了最流行、危害最大的幾個漏洞中就有命令註入漏洞。這種漏洞利用起來非常的簡單。只要會使用基本的命令就可以利用,入門門檻非常非常的低。以DVWA為靶機,測試一下命令註入漏洞。 ...
  • 1. 學習計劃 1、Solr服務搭建 2、Solrj使用測試 3、把資料庫中的數據導入索引庫 4、搜索功能的實現 2. Solr服務搭建 2.1. Solr的環境 Solr是java開發。 需要安裝jdk。 安裝環境Linux。 需要安裝Tomcat。 2.2. 搭建步驟 第一步:把solr 的壓縮 ...
  • String類的概述 String 類代表字元串。Java 程式中的所有字元串字面值(如 "abc" )都作為此類的實例實現。字元串是常量,一旦被賦值,就不能被改變。 String類的構造方法 * public String():空構造 * public String(byte[] bytes):把 ...
  • 本文來自作者 未聞 在 GitChat 分享的{基於 Docker 的微服務架構實踐} 前言 基於 Docker 的容器技術是在2015年的時候開始接觸的,兩年多的時間,作為一名 Docker 的 DevOps,也見證了 Docker 的技術體系的快速發展。本文主要是結合在公司搭建的微服務架構的實踐 ...
  • ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...