字元串賦值

字元串主要用於編程,概念說明、函式解釋、用法詳述見正文,這裡補充一點:字元串在存儲上類似字元數組,所以它每一位的單個元素都是可以提取的,如s=“abcdefghij”,則s[1]=“a”,s[9]=j,而字元串的零位正是它的長度,如s[0]=10(※上述功能Ansistring沒有。),這可以給我們提供很多方便,如高精度運算時每一位都可以轉化為數字存入數組。但是字元串賦值有一定要求,例如C語言的運算符根本無法操作字元串。在C語言中把字元串當作數組來處理,因此,對字元串的限制方式和對數組的一樣,特別是,它們都不能用C語言的運算符進行複製和比較操作。

基本介紹

  • 中文名:字元串賦值
  • 外文名:String assignment
  • 性質:字元串的賦值方式
  • 表現形式:數組或指針
  • 套用學科:C語言、C++等程式語言
  • 領域:計算機、電信等領域
字元串簡介,定義,表示方式,常用函式,字元串賦值方式,

字元串簡介

定義

字元串或串(String)是由數字、字母、下劃線組成的一串字元。一般記為 s=“a1a2···an”(n>=0)。它是程式語言中表示文本的數據類型。在程式設計中,字元串(string)為符號或數值的一個連續序列,如符號串(一串字元)或二進制數字串(一串二進制數字)。
通常以串的整體作為操作對象,如:在串中查找某個子串、求取一個子串、在串的某個位置上插入一個子串以及刪除一個子串等。兩個字元串相等的充要條件是:長度相等,並且各個對應位置上的字元都相等。設p、q是兩個串,求q在p中首次出現的位置的運算叫做模式匹配。串的兩種最基本的存儲方式是順序存儲方式和連結存儲方式。

表示方式

正確定義:
char[]={‘c’,’c’,’c’};或char[4]={‘c’,’c’,’c’};
需要注意下列問題:
1.char[]={“cc”};
如果使用這種定義方法,則數組長度必須大於字元串的長度,至少大1。當然也可以不指定數組長度;
例如:
char[3]={“str”}
char[3]=”ccc”;
以上這兩種,錯誤定義,系統會報錯,字元溢出。
2.char[3]={‘c’,’c’,’c’};
這種定義方法,系統不會報錯,但最後的輸出會出現亂碼。

常用函式

字元串輸入函式:
函式
格式
功能
gets()
gets(字元數組)
從鍵盤輸入一以回車結束的字元串放入字元數組中, 並自動加'\0'
scanf()
scanf("%s", 字元數組)
從鍵盤輸入一以空格或回車結束的字元串放入字元數 組中,並自動加'\0'
字元串輸出函式
函式
格式
功能
puts()
puts(字元串地址)
向顯示器輸出字元串(輸出完,換行)
printf()
printf("%s", 字元串地址)
依次輸出字元串中的每個字元直到遇到字元'\0'('\0'不會被輸出)
字元串的長度
函式
格式
功能
strlen()
strlen(字元串地址)
計算字元串長度,返回字元串實際長度,不包括'\0'在內
字元串的複製
函式
格式
功能
strcpy ()
strcpy (字元數組1,字元串2)
將字元串2拷貝到字元數組1中去,返回字元數組1的首地址
strncpy ()
strncpy (字元數組1, 字元串2, 長度n)
將字元串1前n個字元的子串與字元串2前n個字元的子串進行比較
字元串的比較
函式
格式
功能
strcmp ()
strcmp (字元串1, 字元串2)
比較兩個字元串,對兩串從左向右逐個字元比較(ASCII碼),直到遇到不同字元或'\0'為止
stricmp()
stricmp(字元串1, 字元串2)
同strcmp,stricmp在比較兩個字元串時不區分大小寫,而strcmp則區分大小寫
strncmp ()
strncmp (字元串1, 字元串2, 長度n)
將字元串1前n個字元的子串與字元串2前n個字元的子串進行比較
上述為幾種常見的字元串的函式。

字元串賦值方式

C語言中,字元串的表現形式有兩種:一種是以字元數組的形式,如char str[20]="I love china";另一種是以字元指針的形式,如char *str="I love china"。字元串可以賦值給字元指針變數,或者將字元串用字元數組保存。因為c語言沒有直接對字元串提供語法糖方面的支持。而且C標準庫很多方法處理字元串是以空字元結尾為前提的,這個必須要記住。
char *p,a='5';
p=&a;                     //顯然是正確的,
p="abcd";              //但為什麼也可以這樣賦值??
在如上程式中,雙引號做了3件事:申請了空間(在常量區),存放了字元串 ;在字元串尾加上了’/0’ ;返回地址。這裡就是把返回的地址賦值給了p。
但是char *p = “hello”;表達式為什麼可以,而把p換成數組,然後再賦值就不行了。這是因為字元串常量”hello”出現在一個表達式中時,”hello”表達式使用的值就是這些字元所存儲的地址(在常量區),而不是這些字元本身。所以,可以把字元串賦值給指向字元的指針p,而不能把字元串賦值給一個字元數組。char a[10] = “hello”; 這樣也是可以的,這種情況是c語言初始化所支持的。如果寫成char a[10]然後 a = “hello” 這樣就錯誤了。同樣是a數組,char a[10] = “hello”;這種是數組的初始化,和a[0] = ‘h’ a[1] = ‘e’…是一個道理。但是換成char a [10],然後a = “hello”就不行了 “hello”賦值的值是一個地址,而a雖然也有地址,但是這與指針是不一樣的,指針的值是地址,而數組的值雖然也是地址,但是卻是一個常量,所以不能給常量賦值。
我們來測試一下:
#include <stdio.h> int main(){       char *p = "hello";        printf("%s",p);       
        char a[10];        a = "hello";      
        return 0;}error C2440: '=' : cannot convert from 'char [6]' to 'char [10]'        There is no context in which this conversion is possible
看到這樣的錯誤提示,試一下把char a[10]改成char a[6]
error C2106: ‘=’ : left operand must be l-value
運算符的左邊應該是一個“左值”。所謂“左值”就是指在程式中占用記憶體空間、可以被修改的量,比如各種變數。
在使用指針的時候,指針可以自增,而數組名不能自增編譯器給數組分配了空間,數組a的地址就表示一個常量了,讓常量自增這肯定是不行的。
同時,在指針自增的時候,編譯器會自動識別類型,比如指針是指向int型的,想獲取下一個的地址時,指針直接p++就行了,不要多此一舉的p+4了。
需要注意的是,在void指針使用的時候,不能使用指針運算,因為void型編譯器不能識別類型的長度(即指針所指對象的體積),p++這樣就是不合法的,即不能進行數學運算,也不能使用*取值操作,想使用必須轉換為其它的類型。

相關詞條

熱門詞條

聯絡我們