1. 程式人生 > >C語言中字元陣列的初始化與賦值

C語言中字元陣列的初始化與賦值

1.字元陣列初始化

在C語言中,字串是當做字元陣列來處理的;所以字串有兩種宣告方式,一種是字元陣列,一種是字元指標。

  • 字元陣列初始化
char parr[] = "zifuchuanshuzu";
char charr[] = { 'z','i','f','u','c','h','u','a','n','s','h','u','z','u' };

這是字元陣列初始化的兩種方式,但是這兩種方式其實是不等價的;他們的陣列長度不同。

#include<stdio.h>
int main() {
    char parr[] = "zifuchuanshuzu";
    //與charr[]不等價
char charr[] = { 'z','i','f','u','c','h','u','a','n','s','h','u','z','u' }; //等價於charr[] char charr_test[] = { 'z','i','f','u','c','h','u','a','n','s','h','u','z','u' ,'\0'}; int num_parr = sizeof(parr); int num_charr = sizeof(charr); int num_charr_test = sizeof(charr_test); printf
("The parr[] is : %s\n", parr); printf("The size of parr[] is : %d\n\n", num_parr); //與charr[]不等價 printf("The charr[] is : %s\n", charr); printf("The size of charr[] is : %d\n\n", num_charr); //等價於charr[] printf("The charr_test[] is : %s\n", charr_test); printf("The size of charr_test[] is : %d\n"
, num_charr_test); return 0; }

執行結果如圖:
這裡寫圖片描述
從結果可以看到第二種初始化方式,列印的結果有問題,但是字元數量沒有問題。這是因為字串預設是以’\0’結束的,第二種初始化方式中沒有’\0’,而我們以字串方式列印,所以出錯;
第一種第一方式是系統自動添加了’\0’;我們可以看到其字元數量是15(與第三種相同)。

下面的初始化方式是錯誤的

char parr[15];
parr[]="zifuchuanshuzu";

錯誤的原因:
C語言並沒有提供可以直接操作字串的運算子;“=”可以用於其他資料型別的賦值,但是不可以直接給字串賦值。

  • 字串處理函式:

    • strcpy函式

    • strcat函式

char *strcpy(char *dest,const char*src);

標頭檔案:string.h和stdio.h
功能:將src地址開始且包含’\0’結束符的字串複製到以dest開始的空間。
注:
字元陣列dest必須是陣列名形式,src可以是陣列名也可以是字串常量
可以用strcpy將src的前若干個字元複製到字元陣列中

char *strcat(char *dest,const char *src);

標頭檔案:string.h
功能:
把src中的內容複製到dest結尾處(覆蓋’\0’)。
注:
src和dest記憶體區域不可以重疊,dest必須有足夠的空間來容納src;
字元陣列dest必須是陣列名形式,src可以是陣列名也可以是字串常量;
返回指向dest的指標;

#include<stdio.h>
#include<string.h>
int main() {
    //利用strcpy為字元陣列賦值
    char parr[40];
    strcpy(parr,"zifuchuanshuzu");
    printf("The parr[] is : %s\n\n", parr);
    //賦值字串的一部分
    char charr[] = "_test_strcat_redundance";
    char tarr[13];
    charr[12] = '\0';//複製charr的前12個字元
    strcpy(tarr, charr);
    printf("The tarr[] is : %s\n\n", tarr);
    //字串連結
    strcat(parr, charr);
    printf("The parr and tarr[] is : %s\n", parr);
    return 0;
}

結果:
這裡寫圖片描述

2.字元指標

在C語言中我們也可以使用字元指標來儲存字串。

  • 字元指標初始化
char* str="zifuchuanshuzu";

C語言對字串常量是按照字元陣列來處理的,在記憶體中開闢了一個字元陣列用來存放字串常量,程式在定義字串指標變數str時,只是把字串首地址賦值給str。
輸出:

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

系統首先輸出str指向的字元,而後自加1,直至遇到’\0’;與陣列的輸出方式相同。

  • 字元指標的賦值
char *str;
str="zifuzhizhen";

對於字元指標這種賦值方式是正確的。與字元陣列不同。

3.總結

  • 在C語言中並沒有直接提供字串的操作,其字串操作是通過轉化為字串完成的,例如字元陣列,字元指標,其本質是對字元的操作。
  • 作為字元陣列,與普通陣列相同,區別在於它的每一個元素是一個字元,所以不可以直接用“=”對字元陣列賦值(parr[]=”zhifushuzu”,是錯誤的賦值方式),但是可以對每一個元素進行賦值(charr[12]=’\0’是正確的)。
  • 字串一定是以’\0’結尾的;字元陣列和字元指標我們當做字串整體初始化,系統會自動新增’\0’;對於字元陣列,如果採用單個字元的方式進行初始化或者賦值一定要考慮結束符’\0’

以上是個人理解,有錯誤的地方歡迎指正。

相關推薦

C語言的未初始變數的

C語言中未初始化的變數的值是0麼 全域性變數 、靜態變數初始值為0區域性變數,自動變數初始值隨機分配 C語言中,定義區域性變數時如果未初始化,則值是隨機的,為什麼?定義區域性變數,其實就是在棧中通過移動棧指標來給程式提供一個記憶體空間和這個區域性變數名繫結。因為這段

C語言字元陣列初始

1.字元陣列初始化 在C語言中,字串是當做字元陣列來處理的;所以字串有兩種宣告方式,一種是字元陣列,一種是字元指標。 字元陣列初始化 char parr[] = "zifuchuanshuzu"; char charr[] = { 'z','i',

C語言全域性變數初始的重要性!!!

在C語言裡,全域性變數如果不初始化的話,預設為0,也就是說在全域性空間裡:   int x =0; 跟 int x; 的效果看起來是一樣的。但其實這裡面的差別很大,強烈建議大家所有的全域性變數都要初始化,他們的主要差別如下:   編譯器在編譯的時候針對這兩種情況會產生兩種符

C語言字元陣列和字串指標分析

    這幾天搞Unix上的C程式,裡面用到了很多字元陣列和字串指標,我記得在學完C語言後相當一段時間裡,對指標這個東西還是模模糊糊,後來工作也沒怎麼用到過C,雖然網上這類的文章也有很多,還是決定自己在這做個小總結,也算加深下自己的印象,寫了下面的測試程式: #include <stdio.h>

Effective C++筆記之一:宣告、定義、初始

一.宣告(Declaration)        區分宣告和定義可以讓C++支援分開編譯,宣告常常見於標頭檔案中。原始檔包含標頭檔案之後,就可以使用這個變數,即使沒有看到該變數的定義。 宣告的語法如下: extern int i; // object decl

C/C++結構體初始

1.結構體的初始化 結構體是常用的自定義構造型別,是一種很常見的資料打包方法。結構體物件的初始化有多種方式,分為指定初始化、順序初始化、建構函式初始化。假如有如下結構體。 struct A { int b; int c; } (1)指定初始

關於全域性變數初始問題的思考

    無意中在程式中遇到了一個問題,簡化程式效果如下: #include <iostream> using namespace std; string temp_String; temp_String = "hello"; int _tmain(int

static final的初始問題

1.Class 檔案的生成階段 Sun javac編譯器對於靜態field欄位的初始化賦值策略 目前的Sun javac編譯器的選擇是: 1.如果使用final和static同時修飾一個field欄位,並且這個欄位是基本型別或者String型別的

2.1詳解變數的定義、初始

在前的課程中我們談到,變數其實就是一塊記憶體空間的名稱。簡要地說,計算機擁有可供程式使用的隨機存取儲存器(RAM),當一個變數被定義時,一部分記憶體就會被預留給這個變數。 記憶體的最小單位是二進位制數字(binary digit,bit,位元),0或者1。你可以把bi

結構體的初始

結構體的初始化 typedef struct sTest { int a; int b; }STEST; STEST s1 = {0};

Go-struct巢狀初始

struct巢狀的幾種用法。 示例一 package main import "fmt" import "encoding/json" type Point struct { X, Y int } type Circle struct {

Java____變數的初始相關

Java的賦值和初始化包括很多容易被忽視的地方,在此分類總結如下: 1.和賦值相關: 基本型別的賦值運算需要注意的是賦值時的型別轉換問題,什麼時候可以自動轉換,什麼時候需要強制型別轉換是需要弄清楚的。 首先記住兩個約定:   (1)所有的字面整數都是int型的。

初始 宣告定義

左值既能在賦值的左邊,又能在右邊。 右值只能在右邊。  (++a  是左值  a++是右值); a+1:取變數a的記憶體中的值,然後相加 b = a;把a記憶體中的值拷貝到b的記憶體中 初始化:建立變數並給它賦初始值。 賦值:擦出物件的當前值並用新值替代。 int a(

C語言字元陣列(字串)的定義初始

1、字元陣列的定義與初始化 字元陣列的初始化,最容易理解的方式就是逐個字元賦給陣列中各元素。 char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'}; 即把10個字元分別賦給str[0]到str[9]10個元素 如果花

g++ 記憶體分配 c 語言陣列越界問題 (一道有趣的面試題)

首先是一段程式: # include <stdio.h> int main(int argc, char* argv[]){ int i = 0; int arr[3] = {0}; for(; i<=3; i++){ arr[i]

c語言記憶體的動態分配釋放(多維動態陣列構建)

一. 靜態陣列與動態陣列    靜態陣列比較常見,陣列長度預先定義好,在整個程式中,一旦給定大小後就無法再改變長度,靜態陣列自己自動負責釋放佔用的記憶體。    動態陣列長度可以隨程式的需要而重新指定大小。動態陣列由記憶體分配函式(malloc)從堆(heap

初學Linux(二)---Linux下C語言陣列指標

初學Linux(二)—Linux下C語言中的陣列與指標 在經過階段一的linux學習之後,我來到了階段二的Linux下的C語言程式設計,雖然學到目前linux下的C語言似乎跟之前學的C語言所差無幾,但是按照老師的話來說,C語言指標這塊尤為重要,而我在這一方面的

C++的複製初始直接初始

C++ Primer裡說過,在C++中,初始化不等於賦值,初始化是指建立變數並給變數賦初值,而賦值是指擦除變數的當前值並用新值替換。C++中有兩種初始化方法,直接初始化和複製初始化。直接初始化是指使用 Object obj(patamer)這樣的語句,Object可以是內建

C語言結構體數組內帶字符數組初始

指定 char 字符數 全局 種類 def 變量 指針 變量定義 1.首先定義結構體數組: typedef struct BleAndTspRmtCmd{ char terminal[3]; char note[3]; char rmtCmd[10]; char cmdP

C語言關鍵詞static的用法作用域

細心 錯誤 不同 color 運行程序 可能 gpo 需要 之間 一、面向過程設計中的static 轉載:http://blog.csdn.net/celerylxq/article/details/6160499 1、靜態全局變量 在全局變量前,加上關鍵字stati