每種語言中對字符串的操做要求都比較高,掌握字符串的操做,能夠幫助咱們對字符串進行更好的封裝和拆分,完成信息的傳遞(發送和接受)緩存
字符串在內存中的存儲方式(一個字符對應一個字節,內存中存貯的字符的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的子串。若是是,則該函數返回str2在str1中首次出現的地址;不然,返回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
介紹:
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*
功能:函數返回字符串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