C語言字符數組與字符串的使用詳解

2022-01-01 C語言中文社區
正文1、字符數組的定義與初始化

字符數組的初始化,最容易理解的方式就是逐個字符賦給數組中各元素。char str[10]={ 'I',' ','a','m',' ',『h','a','p','p','y'};

即把10個字符分別賦給str[0]到str[9]10個元素

如果花括號中提供的字符個數大於數組長度,則按語法錯誤處理;若小於數組長度,則只將這些字符數組中前面那些元素,其餘的元素自動定為空字符(即 '\0' )。

2、字符數組與字符串

在c語言中,將字符串作為字符數組來處理。(c++中不是)

在實際應用中人們關心的是有效字符串的長度而不是字符數組的長度,例如,定義一個字符數組長度為100,而實際有效字符只有40個,為了測定字符串的實際長度,C語言規定了一個「字符串結束標誌」,以字符'\0'代表。如果有一個字符串,其中第10個字符為'\0',則此字符串的有效字符為9個。也就是說,在遇到第一個字符'\0'時,表示字符串結束,由它前面的字符組成字符串。

系統對字符串常量也自動加一個'\0'作為結束符。例如char str[ ]={"I am happy"};

可以省略花括號,如下所示

char str[ ]="I am happy";

注意:上述這種字符數組的整體賦值賦值,字符數組的賦值只能對其元素一一賦值,下面的賦值方法是錯誤的

char str[ ];
str="I am happy";

搜索公眾號C語言中文社區,後臺回復「資源」,免費獲取200G編程資料。

不是用單個字符作為初值,而是用一個字符串(注意:字符串的兩端是用雙引號「」而不是單引號『'括起來的)作為初值。顯然,這種方法更直觀方便。(注意:數組str的長度不是10,而是11,這點請務必記住,因為字符串常量"I am happy"的最後由系統自動加上一個'\0')

因此,上面的初始化與下面的初始化等價

char str[ ]={'I',' ','a','m',' ','h','a','p','p','y','\0'};

而不與下面的等價

char str[ ]={'I',' ','a','m',' ','h','a','p','p','y'};

前者的長度是11,後者的長度是10.說明:字符數組並不要求它的最後一個字符為'\0',甚至可以不包含'\0',向下面這樣寫是完全合法的。

char str[5]={'C','h','i','n','a'};

可見,用兩種不同方法初始化字符數組後得到的數組長度是不同的。

#include <stdio.h>
void main(void)
{
char c1[]={'I',' ','a','m',' ','h','a','p','p','y'};
char c2[]="I am happy";
int i1=sizeof(c1);
int i2=sizeof(c2);
printf("%d\n",i1);
printf("%d\n",i2);
}

結果:10   11

3、字符串的表示形式

在C語言中,可以用兩種方法表示和存放字符串:

C語言對字符串常量是按字符數組處理的,在內存中開闢了一個字符數組用來存放字符串常量,程序在定義字符串指針變量str時存放字符串的字符數組的首地址)賦給str。

兩種表示方式的字符串輸出都用

printf("%s\n",str);

%s表示輸出一個字符串,給出字符指針變量名str(對於第一種表示方法,字符數組名即是字符數組的首地址,與第二種中的指針意義是一致的),則系統先輸出它所指向的一個字符數據,然後自動使str自動加1,使之指向下一個字符...,如此,直到遇到字符串結束標識符 " \0 "。

4、對使用字符指針變量和字符數組兩種方法表示字符串的討論

雖然用字符數組和字符指針變量都能實現字符串的存儲和運算,但它們二者之間是有區別的,不應混為一談。

4.1、字符數組由若干個元素組成,每個元素放一個字符;而字符指針變量中存放的是地址(字符串/字符數組的首地址),絕不是將字符串放到字符指針變量中(是字符串首地址)4.2、賦值方式:

對字符數組只能對各個元素賦值,不能用以下方法對字符數組賦值char str[14];

str="I love China";    (但在字符數組初始化時可以,即char str[14]="I love China";)而對字符指針變量,採用下面方法賦值:

char* a;

a="I love China";

或者是 char* a="I love China";       都可以

4.3、對字符指針變量賦初值(初始化):

char* a="I love China";
等價於:

char* a;
a="I love China";

而對於字符數組的初始化

char str[14]="I love China";

不能等價於:

char str[14];
str="I love China"; (這種不是初始化,而是賦值,而對數組這樣賦值是不對的)

4.4、如果定義了一個字符數組,那麼它有確定的內存地址;而定義一個字符指針變量時,它並未指向某個確定的字符數據,並且可以多次賦值。5、字符串處理函數5.1
char *strcat(char *str1,const char *2 );
char *strcat(char *strDestination,const char *strSource );

功能:函數將字符串str2 連接到str1的末端,並返回指針str1

註:連接前兩個字符串的後面都有一個' \0 ',連接時將字符串1後面的 ' \0 『去掉,只在新串最後保留一個 ' \0 『

5.2
char *strcpy(char *str1,const char *2 );
char *strcpy(char *strDestination,const char *strSource );

功能:複製字符串strSource中的字符到字符串strDestination,包括空值結束符。返回值為指針strDestination。

註:1、「字符數組1」必須寫成數組名形式,「字符串2"可以是字符數組名,也可以是一個字符串常量

2、複製時連同字符串後面的 ' \0 ' 一起複製到數組1中

3、不能用賦值語句直接將一個字符串常量或者字符數組直接賦給一個字符數組(同普通變量數組是一樣的),而只能用strcpy函數處理。

4、可以用strcpy函數將字符串2中的前若干個字符複製到字符數組1中去。

相關焦點

  • C語言字符數組和字符串
    字符數組的各個元素依次存放字符串的各字符,字符數組的數組 名代表該數組的首地址,這為處理字符串中個別字符和引用整個字符串提供了極大的方便。一、字符數組字符數組的定義形式與前面介紹的數值數組相同。例如: 字符數組也允許在定義時進行初始化賦值。
  • c語言指針與字符數組
    我們所說的字符串就是字符數組的一種,就如我們常見的"hello world!",字符串的使用在C語言中也是非常重要的,常常會遇到一些操作,如字符串的修改、拷貝、字符串長度等,在物聯網的應用中也尤為突出,物聯網應用中所用的模組,大多是需要使用AT指令的,這就需要對字符串的操作。
  • C語言對字符串的處理
    二維數組,char s[10][8]數組的首元素(得理解這個首元素,從一維數組的角度看的)是一維數組s[0],因此退化成&s[0]指針。4.數組定義字符串和指針定義字符串的區別使用數字定義的字符串只分配字符串所需的空間(上例中為6個字節),數字名沒有單獨的存儲空間;使用指針定義字符串,除了字符串佔用的空間,還要為指針變量分配對應的空間。
  • C語言中字符串的結束標誌是什麼
    C語言中字符串的結束標誌是【'\0'】。C語言中沒有專門的字符串變量,通常用一個字符數組來存放一個字符串,字符串總是以【'\0'】作為結束符。
  • C語言|字符串數組的初始化
    用字符串初始化2. 用單個字符初始化在這裡我們可以看到,存儲「hello」的字符串數組的大小應該至少為6的,但這裡我們發現把數組的大小設為5,程序也可以正常運行,如下圖所示。再小了就會報錯了但是,在用第一種方法,即直接用字符串賦值的時候卻要嚴格遵守字符串數組的大小規則此時程序報錯,有知道這是為什麼的朋友可以留言或者私信我在插入了』\0』之後,字符串就結束了也可以在其中插入回車符來實現換行的效果3.
  • C語言編程技巧:跟我學如何定義及使用一個字符串數組
    實現目的我們在用C語言編寫程序時,經常會遇到使用字符串數組的情況,這種數組的特點是, 數組中的每個元素都是一個字符串,但每個字符串的長度卻不相同。如果你使用C++語言進行編程的話,實現起來相對比較簡單,只需直接選擇標準模板庫的字符串string類,在代碼中定義該類的一個數組即可實現。現在的問題是,在純C語言中如何定義這樣的一個字符串數組呢?如對於下面的一個字符串數組:str = {「I love C.」
  • c語言如何查找字符串指定字符
    c語言查找字符串指定字符的方法:1、【strchr()】用來查找某字符在字符串中首次出現的位置;2、【strrchr()】函數用於查找某字符在字符串中最後一次出現的位置
  • MATLAB字符和字符串
    可以像數值數組的建立那樣直接輸入,也可以使用str2mat等函數建立。【例3-6】 多行串數組的直接輸入示例。>> size(S)ans =2 18需要注意的是:在直接輸入多行字符串數組的時候,每一行的字符個數必須相同。【例3-7】 使用函數str2mat創建多行串數組示例。
  • 一文帶你了解c++和c中字符串的使用
    對於c語言當中,你好像沒有看到有關於字符串定義的關鍵字,不像我們常規的整型、浮點型、字符類型、指針、數組、結構體等數據類型,都能夠一眼就能看出他們是什麼數據類型
  • 入門C語言中的數組,字符串常量與指針
    數組數組聲明為 數據類型 名稱[ constant-size ],並將一個數據類型的一個或多個實例分組到一個可尋址的位置,constant-size可能是一個表達式,但是該表達式必須求值為常量,例如: #define MAX_SIZE 16
  • 【C語言更新】C語言中字符串的操作
    void  *memset(void *str, int c, size_t n)複製字符  c(一個無符號字符)到參數 str 所指向的字符串的前 n 個字符。char  *strcat(char *dest, const char *src)把 src 所指向的字符串追加到 dest 所指向的字符串的結尾。
  • 【自學C語言】書筆記I 29 指針和字符串
    二、指針訪問字符串    C語言可以用兩種方法訪問一個字符串,具體說明如下:    1.用字符數組存放一個字符串,然後輸出該字符串。        在C語言中,函數cprstr的形參為兩個字符指針變量,pss指向源字符串,pds指向目標字符串。        在此需要注意,(*pds=*pss)!='/0'的用法。        使用函數cprstr可以實現字符串賦值功能。    運行結果:
  • JavaScript 字符串中 indexOf 方法 數組filter方法
    Java中字符串中子串的查找共有四種方法(indexof())  indexOf 方法返回一個整數值,指出 String 對象內子字符串的開始位置
  • C語言字符串處理函數之字符串轉換、查詢函數
    介紹完字符串整體操作函數,就該到字符串查詢函數和字符串轉換函數了,至於一些字符串轉換函數,如atoi(),atof(),strtod(),strtol(),tolower(),toupper()等,以後有時間再整理整理。
  • C/C++中字符串常量的不相等性及字符串的Copy
    ,但在c/c++卻不是這樣。  答案在這裡:因為字符串常量存儲在計算機內存中,兩個字符串常量的地址均不相同,所以這樣的比較自然就不會得到我們所需要的結果,如果要進行是否相等的比較應該使用strcmp()這個涵數進行比較!
  • C語言複習計劃(五)|「字符串」篇
    函數返回值就是str 中字符的個數。2.字符串複製函數strcpy()和strncpy()調用格式:strcpy(字符數組1,字符串2)功能:複製第二個參數的內容到第一個參數中。第一個參數必須有足夠的內存來接受第二個參數,第二個參數可以是含有結束符'\0'的字符串(字符數組或字符串常量)。
  • 很「迷」的字符與字符串
    今天將主要講解字符類型和字符串類型,這兩個類型看起來很簡單,但卻是經常發生問題的地方,所以一定要仔細閱讀哦。回顧上篇博文《4.這裡的定義利用了一些數組的知識,將在後面介紹。下面的程序使用了上面的兩種方式分別創建了兩個字符串
  • c語言字符串 數字轉換函數大全
    float c;     c=atof(a)+atof(b);     printf(「c=%.2f\n」,c);     }執行 c=-98.23atoi(將字符串轉換成整型數)相關函數 atof,atol,atrtod,strtol,strtoul
  • C語言模擬實現字符串操作函數
    前言 在編寫程序過程中,我們經常使用到一些字符串函數,例如求字符串長度,拷貝字符串……,這些函數都在C標準庫中存在,我們可以直接使用。但我們還需要掌握這些函數的實現方法,今天來看看一些常用的字符串操作函數的實現方法。
  • C sharp 編程基礎之字符串及字符串提供的各種方法解析
    一、字符串的簡要概述:在編程時字符串是比較常用的一種數據類型,例如用戶名、郵箱、家庭住址、商品名稱等信息都需要使用字符串類型來存取。在 C# 中,您可以使用字符數組來表示字符串,但是,更常見的做法是使用 string關鍵字來聲明一個字符串變量。string 關鍵字是 System.String 類的別名。當你給一個字符串重新賦值之後,老值並沒有銷毀,而是重新開闢一塊空間存儲新值。