C語言中字符串的理解和經常使用的字符串操做

        每種語言中對字符串的操做要求都比較高,掌握字符串的操做,能夠幫助咱們對字符串進行更好的封裝和拆分,完成信息的傳遞(發送和接受)緩存

一、字符串的本質

    字符串在內存中的存儲方式(一個字符對應一個字節,內存中存貯的字符的ASSIC碼值)函數

    

    整數在內存中的存儲本質(將1234的字符轉化爲其對象的ASCII值存貯在內存中)spa

        

    字符串的讀取規則(遇到結束符就結束,無論後面還有沒有字符,若是都沒有結束符,就會使程序卡死在那裏。).net

    

    整數的讀取顯示和內存中的存儲(與大小字節序有關)指針

        詳細請看    http://my.oschina.net/u/1783725/blog/647973code

二、字符串結束符 (很重要)

    '0',NULL,0 這三個都是字符串的結束符,在內存中佔用一個字節,內存值爲 0x00orm

printf(" \'0\'=%d  \'\\0\'=%d  NULL=%d  0=%d\n",'0','\0',NULL,0);       //打印出整型值(十進制)
printf(" \'0\'=%#x  \'\\0\'=%#x  NULL=%#x  0=%#x \n",'0','\0',NULL,0);  //打印出整型值(十六進制)

    輸出: htm

 '0'=48  '\0'=0  NULL=0  0=0        //能夠看出字符串結束符的整型值都是0
 '0'=0x30  '\0'=0  NULL=0  0=0      //能夠看出字符串結束符的整型值都是0

 意義:就是在讀取字符串時,遇到它(字符串結束符),就算讀到字符串的結尾了,不在管後面還有沒有字符串了。對象

三、字符串的截取strstr(str1,str2)和strtok(str1,str2)blog

strstr(str1,str2) 函數獲取指定字符串首次出現的位置。

用於判斷字符串str2是不是str1的子串。若是是,則該函數返回str2str1中首次出現的地址;不然,返回NULL

包含文件:string.h

原型:char *strstr(char *str1, const char *str2);

參數說明

str1: 被查找目標 

str2:要查找對象 

該函數返回str2第一次在str1中的位置,若是沒有找到,返回NULL

實例:

#include <stdlib.h>
#include <string.h>

int main(void)
{
	char srcString[] = "myFamily = myMothet + myFather";      //源字符串 
	char splitString[] = "my"; 		    //須要判斷位置的字符串 
	char *result = NULL;
	
	printf("source string is \"%s\" \n",srcString);
	result = strstr(srcString,splitString); 
	//依次打印出全部"abc"出現的位置及其後的字符串 
	while(result != NULL)
	{
		printf("result is index:%d    \"%s\"\n",(int)(result-srcString),result);
		result = strstr(result+strlen("abc"),splitString);	
	}
	
    return 0;
}

    輸出結果:

source string is "myFamily = myMothet + myFather"
result is index:0    "myFamily = myMothet + myFather"
result is index:11    "myMothet + myFather"
result is index:22    "myFather"

strtok(str1,str2) 函數,根據str2的分隔符集合,獲取被分隔符分割出的子字符串的集合

獲取被分隔符分割出的子字符串的集合,若是分隔標記沒有找到,函數返回NULL,第一次調用str1 指向做爲標記的分隔符。以後因此的調用str1 都應爲NULL。

包含文件:string.h

原型:char *strtok(char *str1, const char *str2);

參數說明

str1: 被查找目標 

str2:分割符集合

該函數返回分隔符依次在str1中出現的位置,若是沒有找到,返回NULL

實例:

#include <stdlib.h>
#include <string.h>

int main(void)
{
	char srcString[] = "Family=Father+Mother+Children"; //源字符串 
	char delims[]="=+";	//分隔符 
	char *result = NULL;
	
	printf("source string is \"%s\" \n",srcString);
	result = strtok(srcString, delims);
	while(result != NULL)
	{
		printf( "result is \"%s\"  index:%d\n", result,(int)(result-srcString));
		result = strtok(NULL, delims);		
	} 
    return 0;
}

輸出結果:

source string is "Family=Father+Mother+Children"
result is "Family"  index:0
result is "Father"  index:7
result is "Mother"  index:14
result is "Children"  index:21

四、strcpy()函數使用

        介紹:

        char *strcpy( char *to, const char *from );

        功能:複製字符串    將from 中的字符複製到字符串to,包括空值結束符。返回值爲指針to。

        注意:

        to和from都是字符指針,若是傳出參數是無符號的字符指針,須要強制類型轉換(char *)(在某些編譯環境下需注意)

        錯誤教訓:

        strcpy(teacher1.name,teacher2.name);   teacher結構體中的name爲unsigned char name[20]          報錯  invalid conversion from `unsigned char*' to `char*

五、size_t strlen( char *str )函數

    功能:函數返回字符串str 的長度( 即空值結束符以前字符數目)。

六、strcat()函數詳解

    介紹:char *strcat( char *dest, char *src);

    功能:函數將字符串src 鏈接到字符串dest的末端,並返回指針dest.

    本質:首先在字符串dest中尋找字符串結束符(若是沒有找到,將不會作任何鏈接),找到後將字符串src(不包括src的結束符)插入到字符串dest最後一個字符與結束符之間。

    證實:

void printBuff(char buff[],int len)
{ 		 
	 int num,numCount;
	 numCount = len;
	 printf("數據的內存顯示:");
	 for(num=0; num < numCount; num++)
	 {
	  	printf("%x ",buff[num]);
     }
	 printf("\n");
} 

int main()
{
	
	char src[20] = {0};
	char str1[10] = "abcd";
	char str2[6] = "efghh";
	memset(src+1,1,sizeof(src)-1);	/*將緩存中所有灌入1(第一個位置除外,由於編譯器須要尋
	                       找src的結束符,找不到的話,將不會進行鏈接操做),排除0(結束符的干擾) */
	printBuff(src,sizeof(src));
	
	strcat(src,str1);
	printf("str1鏈接後的字符串:%s\n",src);
	printBuff(src,sizeof(src));
	
	strcat(src,str2);
	printf("str2鏈接後的字符串:%s\n",src);
	printBuff(src,sizeof(src));

}

    輸出:

數據的內存顯示:0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
str1鏈接後的字符串:abcd
數據的內存顯示:61 62 63 64 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
str2鏈接後的字符串:abcdefghh
數據的內存顯示:61 62 63 64 65 66 67 68 68 0 1 1 1 1 1 1 1 1 1 1

六、字符串與其餘數據類型的相互轉化

    (1)字符串==>整型

    atof (將字符串轉換成浮點型數)
    atoi (將字符串轉換成整型數)
    atol (將字符串轉換成長整型數)
    strtod (將字符串轉換成浮點數)
    strtol (將字符串轉換成長整型數)
    strtoul (將字符串轉換成無符號長整型數)

    (2)字符串<==整型    (有兩種方式,比較重要

    itoa(將整型數轉換爲字符串)

    sprintf( char *buffer, const char *format, ... );將整型數按照指定格式轉化爲buffer

相關文章
相關標籤/搜索