C語言基礎系列--字符串有關內容

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);

分解字符串爲一組字符串。從stringp指向的位置起向後掃描,遇到delim指向位置的字符後,將此字符替換爲NULL,返回stringp指向的地址。
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++只能前進一個字節
發佈了33 篇原創文章 · 獲贊 1 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章