程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 字符串,字符

字符串,字符

編輯:關於C語言

字符串,字符


 

字符串:是以空字符\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);

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved