1.char *
char *buff="orisun";
sizeof(buff)=4 用32位存放一個指針
strlen(buff)=6 strlen返回字符串的實際長度,不包括末尾的'\0'
2.char [n]
char bu[100]="orisun"; 從第7位到第100位都是'\0'
sizeof(bu)=100 bu是一個數組,sizeof返回數組的長度
strlen(bu)=6 strlen返回字符串的實際長度,不包括末尾的'\0'
但注意在printf("%s\n",bu);之前必須先bu[100]='\0';
3.char[]
char bu[]="orisun"; 首先bu是一個數組,它的長度由 "orisun"的長度決定, sizeof(bu)=7
我們知道數組在第1次出現時必須指明長度,因爲在編譯時編譯器就要爲它分配空間,所以下面的寫法是不能通過編譯的:
char bu[];
bu="orisun";
4.不能把const char*賦給char *
const char*的含義並非是指針不可被修改,而是指針指向的內容不可被修改,因此,當把一個const char*賦給一個char*,結果就導致原來加那個const的目的形同虛設,一點意義也沒有了。
5.可以把const char賦給char
基本類型的“賦值”,也就是拷貝一個值而已,拷貝之後,不管你對後面的那個char怎麼修改,都不會影響原先那個const char
6.可以strcpy(char*,const char*)
表頭文件 #include<string.h>
定義函數 char*strcpy(char *dest,const char *src);
函數說明 strcpy()會將參數src字符串拷貝至參數dest所指的地址。
返回值返回參數dest的字符串起始地址。
附加說明如果參數dest所指的內存空間不夠大,可能會造成緩衝溢出(bufferOverflow)的錯誤情況,在編寫程序時請特別留意,或者用strncpy()來取代。
7.strncpy
定義函數 char* strncpy(char *dest,const char *src,size_t n);
函數說明 strncpy()會將參數src字符串拷貝前n個字符至參數dest所指的地址。
8.strdup複製字符串
定義函數 char* strdup( const char *s);
函數說明 strdup()會先用maolloc()配置與參數s字符串相同的空間大小,然後將參數s字符串的內容複製到該內存地址,然後把該地址返回。該地址最後可以利用free()來釋放。
所以strdup和strcpy的區別在於:使用strdup目標指針不需要(也不能)事先分配空間,而使用strcpy則事先把空間分配好。
返回值 返回一字符串指針,該指針指向複製後的新字符串地址。若返回NULL表示內存不足。
9.strcat連接字符串(同理有strncat)
char * strcat( char *dest , const char * src)
返回dest的首地址,dest必須有足夠的空間來容納拷貝的字符串
10.strncasecmp(忽略大小寫比較字符串)
int strncasecmp(const char *s1,const char *s2,size_t n);
11.strtok 分割字符串
char *strtok(char *s, char *delim);
分解字符串爲一組字符串。s爲要分解的字符串,delim爲分隔符字符串。實質上的處理是,strtok在s中查找包含在delim中的字符並用NULL(’\0′)來替換,直到找遍整個字符串。
char buff[]="abc$sw$21";
char *delim="$";
char *title=strtok(buff,delim); //title="abc"
char *address=strtok(NULL,delim); //address="sw"
char *area=strtok(NULL,delim); //area="21"
注意:不能使用char ”buff="abc$sw$21";因爲strtok函數在運行時會改變第一個參數的值,如果把buff定義爲一個常量指針,其值無法被修改,在使用strtok時會發生段錯誤。
12.sprintf(格式化字符串複製)
char sql[200];
memset(sql,0,200);
sprintf(sql,"INSERT INTO T1(title,address,area)VALUES('%s','%s','%s')",title,address,area);
1
2
3
4
5
6
7
8
9
10
11
|
#include<stdio.h> #include<string.h> int
main(){ char
*buff= "10 0x1b abc3.14" ; int
a,b; float
c; char
s[5]; sscanf (buff, "%d %x %3s%f" ,&a,&b,s,&c); printf ( "%d %d %f %s\n" ,a,b,c,s); return
0; } |
輸出:10 27 3.140000 abc
13.strstr
char *strstr(const char *haystack, const char *needle);
從haystack中找到子串needle第一次出現的位置
14.strchr
char *strchr(const char *s, int c);
查找字符串s中字符c第一次出現的位置
strrchr逆向查找
strchr和index的功能及用法完全一樣。
strrchr和rindex的功能及用法完全一樣。
15.strpbrk
char *strpbrk(const char *s, const char *accept);
在s中查找accept中任一個字符首次出現的位置
16.memchr
void *memchr(const void *s, int c, size_t n);
在s的前n個字節中查找c,如果找到就返回指向c的指針,否則返回NULL
17.strspn
size_t strspn(const char *s, const char *accept);
返回字符串s中第一個不在指定字符串accept中出現的字符下標
size_t strcspn(const char *s, const char *reject);
返回字符串s中第一個在指定字符串reject中出現的字符下標
18.strsep
char *strsep(char **stringp, const char *delim);
1
2
3
4
5
6
7
8
9
10
11
12
|
#include<stdio.h> #include<string.h> main(){ char
str[]= "root:x::0:root:/root:/bin/bash:" ; char
*token; char
*buf; buf=str; while ((token=strsep(&buf, ":" ))!=NULL){ printf ( "%s\n" ,token); } } |
輸出
root x 0 root /root /bin/bash |
|
注意在第9行把buf替換爲str是不行的,編譯時警告:期待的參數類型是char **,但傳進來的是char(*)[32],運行時會發生段錯誤。str是一個char數組,buf是一個char指針,第8行buf=str是那允許的,因爲數組名buf存放的就是數組的首地址,即數組名本身也是一個指針。把一個char(*)[10] 賦給一個char**也是可以的,因爲都是指向指針的指針。但是你想,現有
char *arr[]={"asd","werr"};
char *str="tgb";
char **ptr=&str;
arr++就可以指向二維數組的下一行,而ptr++只能前進一個字節