奇妙的字符串

  面對字符串是我們最關係的就是字符串的長度(用strlen())與它所佔的字節數(用sizeof())也就是大小,下來我們就討論一下 


/* 一般我們初始化字符串的幾種方式
char a1[]="1234";
char *a2="1234";
char a3[10]="1234";
char a4[]={'1','2','3','4'};
char a5[]={'1','2','3','4','\0'};
char a6[10]={'1','2','3','4'};
char a7[10]={'1','2','3','4','\0'};

char *a6={'1'};//錯誤  可能有的編譯器.c可以通過
char *a5={'1','2'};//必須給指針一個字符串首地址這個沒有給
char *a7={'1','\0'};//錯誤

char A[2]="1234";//當然它是錯的  不是因爲名字是大寫奧(哈哈)
char A[1]='1';//當然它也是錯的
char *A='1';//當然它也是錯的   
char A[10]="'1','2'";//當然它也是錯的
char A[]='1','2'";//當然它也是錯的
char *A="'1','2'";//當然它也是錯的
char A[10]={"1","2"};//當然它也是錯的  " "之間是字符串 ' '之間是字符
char *A={1,2,3,4};//當然它也是錯的

*/

是不是感覺這莫簡單的東西如果細分還有這莫多東西呢,下來我就淺談一下我的理解


//情況一:
#include<stdio.h>
 
int main()
{
	char a1[]="1234";	
  printf("%d\n",a1[0]);
  printf("%d\n",strlen(a1));
  printf("%d\n",sizeof(a1));

  return 0;

}
//對於上邊的代碼輸出結果是什麼
// 答案是:49 4 5   
// 49 是因爲這裏是字符1    
//4 是因爲strlen()函數在計算長度時找'\0',對於這種字符串會末尾默認有'\0',當strlen()遇到'\0'就會停止計算,所以個數不包括'\0'
//5 是因爲sizeof()這個運算符(這裏也提一句sizeof 是運算符不是函數而且是一個關鍵字)會計算字節數這裏都是字符類型所以只佔5個字節(也包括後邊的'\0')
//情況二:
#include<stdio.h>
 
int main()
{
	char a1[]="\1\2\3\4";
	//char a1[]="\1234";答案是:83 (轉義字符會轉義後邊三個字符把他們當作8進制也就是83的8進制是123即'\123'=83) 	
                       //        2  '\123'  和 '4'兩個字符
	                  //         3   包含'\0'三個字符型 佔3字節
	printf("%d\n",a1[0]);
  printf("%d\n",strlen(a1));
  printf("%d\n",sizeof(a1));
  
  return 0;

}
//對於上邊的代碼輸出結果是什麼
// 答案是:1 4 5   
// 1 是因爲這裏是轉義字符爲數字1    
//4 是因爲strlen()函數在計算長度時找'\0',對於這種字符串會末尾默認有'\0',當strlen()遇到'\0'就會停止計算,所以個數不包括'\0'
//5 是因爲sizeof()這個運算符(這裏也提一句sizeof 是運算符不是函數而且是一個關鍵字)會計算字節數這裏都是字符類型所以只佔5個字節(也包括後邊的'\0')

//情況三:
#include<stdio.h>
 
int main()
{
	char *a2="1234";
	printf("%d\n",a2[0]);
  printf("%d\n",strlen(a2));
  printf("%d\n",sizeof(a2));
  
  return 0;

}
//對於上邊的代碼輸出結果是什麼
// 答案是:49 4 4   
// 49 是因爲這裏是字符1    
//4 是因爲strlen()函數在計算長度時找'\0',對於這種字符串會末尾默認有'\0',當strlen()遇到'\0'就會停止計算,所以個數不包括'\0'
//4 是因爲這裏的a2 是一個指針 指針就是四個字節 無論什麼數據類型指針在32位系統下都是4個字節,有人會說那上一種情況中數組名也是指針,我想說的是數組名代表的是那片空間的地址數組名本身就是地址,所以sizeof()可以順着這個地址計算這個空間佔得字節數,而這裏的指針本身佔有四個字節只是它的裏邊存着那個字符串空間的首地址,指針自身也是個變量也有自己的地址(可以用二級指針存儲),它自己本身不是地址

//情況四:
#include<stdio.h>
#include<string.h>
 
int main()
{
	char a3[10]="1234";	
  printf("%d\n",a3[0]);
  printf("%d\n",strlen(a3));
  printf("%d\n",sizeof(a3));
  
  return 0;

}
//答案是:49  4 10
// 我只解釋一下 10  因爲數組是一片的連續空間在定義數組是就爲它開闢了10個字符型空間  

//情況五
#include<stdio.h>
#include<string.h>
 
int main()
{
	char a4[]={1,2,3,4};//char a[]={1111,2,3,4}	//整型1111 存入char型會發生低位截斷  後邊的長度與大小與本例相同
  printf("%d\n",a4[0]);
  printf("%d\n",strlen(a4));
  printf("%d\n",sizeof(a4));
  
  return 0;

}
//答案是:1,隨機,4
// 1 是因爲int 數據1 可以存入char
//strlen()因爲沒有找到'\0'或數字0 所以繼續找直至找到 所以是一個隨機值,但是會大於等於4,因爲這裏邊有四個元素呀

//情況六:
#include<stdio.h>
#include<string.h>
 
int main()
{
  char a4[]={'1','2','3','4'};
  printf("%d\n",a4[0]);
  printf("%d\n",strlen(a4));
  printf("%d\n",sizeof(a4));
  
  return 0;

}
//答案是:49,隨機,4
//我只解釋 strlen()因爲用戶在定義時沒有初始化'\0'或數字0 所以會繼續向後邊的空間之中找'\0'或數字0,直至找到爲止,但是大於等於4

/情況七:
#include<stdio.h>
#include<string.h>
 
int main()
{
  char a5[]={'1','2','3','4','\0'};//  char a5[]={'1','2','3','4',0}
  printf("%d\n",a5[0]);
  printf("%d\n",strlen(a5));
  printf("%d\n",sizeof(a5));
  
  return 0;

}
//答案是:49,4,5
//我只想說 '\0'與數字0等價在strlen()計算長度時

//情況八:
#include<stdio.h>
#include<string.h>
 
int main()
{
  char a6[10]={'1','2','3','4'};
  printf("%d\n",a6[0]);
  printf("%d\n",strlen(a6));
  printf("%d\n",sizeof(a6));
  
  return 0;

}
//答案是:49,4,10
//我只想說 a6[10]在初始化的時候前四個用字符初始化後邊六個用數字0默認初始化所以strlen()找到第一個0就停了

//情況八:
#include<stdio.h>
#include<string.h>
 
int main()
{
  char a6[10]={'1','2','3','4','\0'};
  printf("%d\n",a6[0]);
  printf("%d\n",strlen(a6));
  printf("%d\n",sizeof(a6));
  
  return 0;

}
//答案是:49,4,10  讀者應該十分清楚





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章