1. 程式人生 > >字元型資料(字元常量和字串常量)使用及區別

字元型資料(字元常量和字串常量)使用及區別

1-字元型

    在各種不同系統中,字元型別都佔一個位元組(8位)。定義如下:

  char c='a';//C 語言中,使用單引號把字元引起來構成字元常量,雙引號"abc"是字串常量也可以用字元對應的ASCII碼賦值,如下:

  char c=97;

     char c='good';得到的是最後一個字元 即'd'

     C語言是ASCII碼的形式儲存字元型變數的,儲存形式與整數類似,所以字元型和整數(範圍0-255)之間可以通用。

2-字串

  I -在c語言中,將字串作為字元陣列來處理。(c++中不是)

     II-長度(佔用記憶體位元組)

     在實際應用中人們關心的是有效字串的長度而不是字元陣列的長度,C語言規定了一個“字串結束標誌”,以字元'\0'代表

。如果有一個字串,其中第10個字元為'\0',則此字串的有效字元為9個。也就是說,在遇到第一個字元'\0'時,表示字串結束,由它前面的字元組成字串。
系統對字串常量也自動加一個'\0'作為結束符。例如"C Program”共有9個字元,但在記憶體中佔10個位元組,最後一個位元組'\0'是系統自動加上的。(通過sizeof()函式可驗證)

   char two[]="abcd";    cout<<sizeof(two);   //輸出為5    strlen 函式原型為:    int mystrlen(const char *str){     //assert(str);     const char *p=str;     while(*p++ != NULL); // or !='\0'     return p-str-1; }

3-strlen 和sizeof區別

strlen(char*)函式求的是字串的實際長度它求的方法是從開始到遇到第一個'\0'如果你只定義沒有給它賦初值,這個結果是不定的,它會從aa首地址一直找下去,直到遇到'\0'停止。 char aa[10];cout<<strlen(aa)<<endl; //結果是不定的 char aa[10]={'\0abc'}; cout<<strlen(aa)<<endl; //結果為0 char aa[10]="jun"; cout<<strlen(aa)<<endl; //結果為3 而sizeof()返回的是變數聲明後所佔的記憶體數,不是實際長度
,此外sizeof不是函式,僅僅是一個操作符,strlen是函式。 sizeof(aa) 返回10 int a[10]; sizeof(a) 返回40  ⒈sizeof操作符的結果型別是size_t,它在標頭檔案中typedef為unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。 ⒉sizeof是操作符(關鍵字),strlen是函式。 ⒊sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以''\0''結尾的。 ⒋陣列做sizeof的引數不退化,傳遞給strlen就退化為指標了。

 4-兩種初始化的長度對比

#include <stdio.h> #include <string.h> int  main() {     char c1[]={'I',' ','a','m',' ','h','a','p','p','y'};     char c2[]="I am happy";     int i1=sizeof(c1);     int i2=sizeof(c2);     char str1[20]="12345";     printf("size c1:%d\n", i1);//10     printf("size c2:%d\n", i2);//11     printf("length:%d\n",strlen(c2));//10     printf("%d %d\n",sizeof(str1),strlen(str1));//20 5     return 0; }

5-字串的表示形式

在C語言中,可以用兩種方法表示和存放字串:
(1)用字元陣列存放一個字串
          char str[ ]="I love China";
(2)用字元指標指向一個字串
          char* str="I love China";

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

int  main(){
char* a ="helko";
char* s[]={"how","are","you"};
int lenthS=0;
char ss[100]="\0abcd";

printf("a[2]=%c\n",*(a+2));//a[2]=l
printf("%s\n",a+1);//elko
lenthS = sizeof(s)/sizeof(char*);
printf("lenthS=%d\n",lenthS);//3
        printf("%s\n",*(s+1));//are
printf("lenth of SS:%d\n",strlen(ss));//0
return 0;
}

6-字串gets  和 scanf()的區別

scanf( )函式和gets( )函式都可用於輸入字串,gets可以接收空格;而scanf遇到空格、回車和Tab鍵都會認為輸入結束,所有它不能接收空格。

char string[15]; 

gets(string); /*遇到回車認為輸入結束*/

scanf("%s",string); /*遇到空格認為輸入結束*/

所以在輸入的字串中包含空格時,應該使用gets輸入;

7-字串轉換函式 strlwr()函式:將字串中的大寫字母換成小寫字母。 strupr()函式:將字串中的小寫字母換成大寫字母。 注:此函式是直接對原字串進行操作,字串的值會改變;
int main(){
char a[]="zbc";
char b[]="ASD";
printf("before:%s\n",a);
printf("Uper:%s  Lower:%s\n",strupr(a),strlwr(b));
printf("after;%s\n",a);
return 0;
}