(超全,超經典)字符串函數與易錯點

1.定義(初始化)語法

char a[]={'a','b'};        //錯誤,沒有寫標誌結束的空字符 '\0'

char a[]={'a','b','\0'};   //正確

char a[2]="ab";          //錯誤,沒有給標誌結束的空字符留出位置

char a[3]="ab";          //正確

注意:作爲標誌結束的空字符在用%s輸出時不會被輸出。

2.限制輸入

char a[8];

scanf("%8s",a);         //錯誤,雖然程序正常運行,但s前面最多寫7(給空字符留一個位置)

                                 //因爲scanf中a是個地址,所以scanf並不知道a有多大,其會繼續向後擴佔內存,營造出一種正確的假象。

                                 //如果被擴佔的內存有數據,則造成無法估量的失誤。

3.字符處理函數庫

頭文件使用字符處理函數庫<ctype.h>

int isblank(int c);

如果這個c是該字符串中兩個單詞之間的空格,返回值爲1,反之返回0。

char a[10]="asdf  klk";//中間有兩個空格
for(int n=0;n<=9;n++)
    printf("%d",isblank(a[n]));

輸出爲 0000110000

注意:Visual C++中沒有這個函數

int isdigit(int c);

如果這個c在該字符串表示數字,返回值爲1,反之返回0。

char a[10]="abcd567hi";
    for(int n=0;n<=9;n++)
        printf("%d",isdigit(a[n]));

輸出爲 0000111000

int isalpha(int c);

如果這個c在該字符串表示字母,則大寫字母返回值爲1,小寫字母返回值爲2,其他返回0。

char a[10]="ABcd567hi";
for(int n=0;n<=9;n++)
    printf("%d",isalpha(a[n]));

輸出爲 1122000220

int isalnum(int c);

如果這個c在該字符串表示字母或數字,則大寫字母返回值爲1,小寫字母返回值爲2,數字返回4,其他返回0。

char a[10]="ABcd567 i";(一個空格)
for(int n=0;n<=9;n++)
    printf("%d",isalnum(a[n]));

輸出爲 1122444020

int isxdigit(int c);

如果這個c表示一個十六進制的字母或數字,返回值爲128,如果不是十六進制的字母或數字,返回0。

char a[20]="123456789ABcdefghij";
for(int n=0;n<=19;n++)
    printf("%d ",isxdigit(a[n]));

輸出爲 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 0 0 0 0 0

int islower(int c);

 如果這個c表示一個小寫字母,返回值爲2,如果不是小寫字母,返回0。

char a[10]="ABcde#%$9";
for(int n=0;n<=9;n++)
    printf("%d",islower(a[n]));

輸出爲 0022200000

int isupper(int c);

如果這個c表示一個大寫字母,返回值爲1,如果不是大寫字母,返回0。

char a[10]="ABcde#%$9";
for(int n=0;n<=9;n++)
    printf("%d",isupper(a[n]));

輸出爲 1100000000

int tolower(int c);

如果這個c表示一個大寫字母,返回值爲其字母小寫,如果不是大寫字母,返回原字符。

char a[10]="ABcde#%$9";
for(int n=0;n<=9;n++)
    printf("%c",tolower(a[n]));

輸出爲 abcde#%$9 

int toupper(int c); 如果這個c表示一個小寫字母,返回值爲其字母大寫,如果不是小寫字母,返回原字符。
char a[10]="ABcde#%$9";
for(int n=0;n<=9;n++)
    printf("%c",toupper(a[n]));

輸出爲 ABCDE#%$9

int isspace(int c);

如果這個c表示一個空白字符,【換行符('\n')空格符(' ')換頁符('\f')回車符(‘\r’)水平製表符('

t')垂直製表符('\v')】,返回值爲8,否則返回0。

char a[10]="12\n \0\f\t\r\v";
for(int n=0;n<=9;n++)
    printf("%d",isspace(a[n]));

輸出爲 0088088880  (空字符'\0'返回0)

int iscntrl(int c};

如果這個c表示一個空白字符,【水平製表符('\t')垂直製表符('\v')換頁符('\f')報警符(‘\a’)退格符(\b')回車符(‘\r’)換行符('\n')空字符('\0')】,返回值爲32,否則返回0。

char a[10]="\t\v\f\a\b\r\n \0";
for(int n=0;n<=9;n++)
    printf("%d ",iscntrl(a[n]));

輸出爲 32 32 32 32 32 32 32 0 32 32

int ispunct(int c);

若c是一個除空格、數字或字母以外的可打印字符——如¥#()【】{};:%,則函數返回爲真,其餘爲假。

在ASCLL表上,第33~47,58~64,91~96,123~126位返回32,其餘返回0。

int isprint(int c);

當c是一個包括空格在內的可打印字符,返回值爲真,否則返回值爲假。

若c是大寫字母,返回1.

若c是小寫字母,返回2.

若c是數字,返回4.

若c是ASCLL碼上第33~47,58~64,91~96,123~126位(即標點符號),返回16.

若c是ASCLL碼上第32位(即空格符),返回64.

其餘返回0.

int sgraph(int c)

當c是一個不包括空格在內的可打印字符,返回值爲真,否則返回值爲假。

若c是大寫字母,返回1.

若c是小寫字母,返回2.

若c是數字,返回4.

若c是ASCLL碼上第33~47,58~64,91~96,123~126位(即標點符號),返回16.

其餘返回0.

4.字符串轉換函數

頭文件需要使用通用工具函數庫<stdlib.h>

double strtod(const char *nPtr,char **endPtr);

 將nPtr指向的字符串轉換成雙精度浮點數

nPtr指向被處理的字符串,endPtr指向一個地址,這個地址指向保存結果的字符串。

(不懂爲什麼這麼指向)

如果被處理字符串無可處理小數,返回0.0

只有第零位到結尾或到字母或到出小數點外其他符號之間的數字才能轉換成雙精度數字,即數字必須在字符串的最前面。

const char *a="  00123.5abc67def";
char *b;
double c=strtod(a,&b);
printf("%s\n%s\n%f",a,b,c);

結果爲 :

  00123.5abc67def
abc67def
123.500000

long strtol(const char *nPtr,char **endPtr,int base);

將nPtr指向的字符串轉換爲長整型數

nPtr指向被處理的字符串,endPtr指向一個地址,這個地址指向保存結果的字符串。

如果被處理字符串無可處理整數,返回0

base爲基數,代表字符串內的整數是幾進制。

比如基數爲14,函數將字符串內1~9,a,A(10),b,B(11),c,C(12),d,D(13)轉換成10進制長整型數

只有第零位到結尾或符號之間的數字才能轉換成長整型數,即整數必須在字符串的最前面。

const char *a="Abc55567def";
char *b;
long c=strtol(a,&b,13);
printf("%s\n%s\n%ld",a,b,c);

結果爲

Abc55567def
def
685190305

unsigned long strtoul(const char *nPtr,char **endPtr,int base);

將nPtr指向的字符串轉換爲無符號長整型數

原理和strtol一樣

5.標準輸入/輸出庫函數

頭文件使用標準輸入/輸出庫<stdio.h>

char *fgets(char *s, int n,PILE *stream);

將輸入的字符串存在s中,只保存n-1位,stream是輸入流,一般用stdin

注意n一定不大於數組。

輸入如果遇見換行符或文件結束符會提前停止輸入,但換行符也會被保存

讀入結束後,一個空字符('\0')被保存在數組的結尾

char a[10];
fgets(a,10,stdin);
printf("%s",a);

輸入 A+B=C=d*e=f/e

輸出 A+B=C=d*e

int putchar(int c); 輸出一個字符
int getchar(void); 輸入一個字符並將其轉化爲整型
int sprintf(char *s,"內容%d",int c);

除了是將輸出的字符串保存到字符串*s以外與printf()沒什麼區別

%d可以爲其他格式說明符

int sscanf(char *s,"內容%d",int c); 除了內容是從字符串*s輸入的以外其他和scanf沒什麼區別

6.字符串處理函數庫中的字符串處理函數

頭文件使用字符串處理函數庫<string.h>

char *strcpy(char *s1,const char *s2)

將s2中的內容複製(覆蓋)到s1中,返回s1.

char a[15]="1234567890";
char b[15]="abcdefghij";
printf("%s\n%s",strcpy(a,b),b);

結果爲

abcdefghij

abcdefghij

char *strncpy(char *s1,const char*s2,size_t n)

將s2中前n個字符複製(覆蓋)到s1中,返回s1.

char a[15]="1234567890";
char b[15]="abcdefghij";
printf("%s\n%s",strncpy(a,b,6),b);

結果爲

abcdef7890

abcdefghij

char *strcat(char *s1,const char *s2)

 將s2中的內容接在s1後並覆蓋s1末尾的空字符,返回s1.

char a[15]="1234567";
char b[15]="abcdefg";
printf("%s\n%s",strcat(a,b),b);

結果爲

1234567abcdefg

abcdefghij

char *strncat(char *s1,const char*s2,size_t n)

將s2中前n個字符接在s1後並覆蓋s1末尾的空字符,返回s1. 

char a[15]="123456789";
char b[15]="abcdefghij";
printf("%s\n%s",strncat(a,b,5),b);

結果爲

123456789abcde

abcdefghij

7.字符串處理函數庫中的比較函數

頭文件使用字符串處理函數庫<string.h>

int strcmp(const char *s1,const char*s2);

逐個字符的比較兩個字符串,s1大於s2返回1,s2大於s1返回-1,相等時下返回0

int strncmp(const char *s1,const char*s2.size_t n); 逐個字符的比較兩個字符串前n個字符,s1大於s2返回48,s2大於s1返回-48,相等時下返回0

8.字符串處理函數庫中的查找函數

頭文件使用字符串處理函數庫<string.h>

char *strchr(const char *s,int c); 確定字符c在字符串s第一次出現的位置並返回出現的地址,否則返回NULL
size_t  strcspn (const char*s1,const char*s2);

字符串s1中從開始到第一次出現一個在s2出現過的字符時這段字符串的長度

char a[15]="abc4567";
char b[15]="123489";
printf("%d",strcspn(a,b));

結果爲 3

因爲b中的4在a第四位出現

char a[15]="abc4567";
char b[15]="12389a";
printf("%d",strcspn(a,b));

結果爲 0

因爲b中的a在a第一位出現

size_t  strspn (const char*s1,const char*s2);

字符串s1從開始到第一次出現s2沒有出現過的字符時這段字符串的長度

char a[15]="4abc56789";
char b[15]="1234789abc";
printf("%d",strspn(a,b));

結果爲 4

因爲4abc在b中出現了,789雖然在b中出現了,但是前面有b未出現的字符

char *strpbrk(const char *s1,const char*s2); 確定字符串s2任意字符在字符串s1第一次出現的位置並返回出現的地址,否則返回NULL
char *strrchr(const char *s,int c); 確定字符c在字符串s最後一次出現的位置並返回出現的地址,否則返回NULL
char *strstr(char *s1,const char*s2);

確定字符串s2全部字符在字符串s1第一次出現的位置並返回出現的地址,否則返回NULL

必須s2全部字符同時在s1中出現才能返回指針

char *strtok(char *s1,const char*s2);

將s1分隔成以‘\0’爲分隔符的一系列標號

在s1中搜索s2中的第一個字符,搜索成功則將s1中的該字符覆蓋爲'\0',開始搜索字符到'\0'前一個字符爲一個標號,strtok函數保存標號後‘\0’的地址,返回標號第一個字符地址。注意保存和輸出是兩回事。

搜索失敗則返回搜索起始字符地址,保存nullptr。

當s1爲nullptr或NULL時,從strtok保存的地址開始搜索,搜索成功則返回'\0'後的標號起始字符地址,保存下一個'\0'的地址。失敗則保存nullptr,返回搜索起始字符地址。當strtok保存的本來就是nullptr,返回nullptr。

char a[13]="4cabc56c78c9";
char *c=strtok(a,"ab");
//搜索s2中的第一個字符,將s1中的該字符覆蓋爲'\0',strtok函數保存標號後‘\0’的地址,返回標號第一個字符地址。
printf("*%s*\n",c);
c=strtok(nullptr,"z");
//返回搜索起始字符地址,保存nullptr。
printf("*%s*\n",c);
c=strtok(nullptr,"c");
//當strtok保存的本來就是nullptr,返回nullptr。
printf("*%s*\n",c);
for(int n=0;n<13;n++)
    printf("%c",a[n]);

結果爲

*4c*
*bc56c78c9*
*(null)*
4c bc56c78c9

9.字符串處理函數庫中的內存處理函數

不止可以處理字符串,不檢查字符串結束符。

void *memcpy (void*s1,const void*s2,size_t n);

將s2的前n位字符覆蓋s1的前n位字符。

返回void*型的指針。

char a[]="abcd567hij";
char b[]="klmn123rst";
memcpy(a,b,5);
printf("%s\n%s",a,b);

結果爲

klmn167hij
klmn123rst

void *memmove (void*s1,const void*s2,size_t n); 與memcpy結果相同,但memmove是先將s2裏的前n位字符複製到一個臨時數組,然後再覆蓋s1的前n位字符。返回void*型的指針。
void memcmp (const void*s1,const void*s2,size_t n); 與strncmp相同,只不過memcmp不止可以處理字符串
void *memchr (const void*s,int c,size_t n); 與strchr相同,只不過需要用void*定義的指針去接收地址
void *memset (void*s,int c,size_t n); 將c覆蓋s的前n位,返回指向s的void型指針

10.字符串處理函數庫的其他函數

char *strerror (int errornum); 將錯誤號errornum按編譯器指定和本地化的形式(即信息可能因爲計算機所在地不同而以不同的語言出現)映射成一個純文本字符串。返回指向這個字符串的指針,錯誤號在errno.h中定義,
size_t strlen(const char *s); 確定字符串s的長度,返回字符串結束符前面字符的個數。(如果有多個結束符以第一個結束符爲準)

11.輸入函數

cin.getline(*str, len);

第一個參數*str是用來存儲輸入行的數組名稱,第二個參數len是要讀取的字符數

輸入一行字符串,遇到換行符停止,保存時不保存換行符

cin.get(str, len);

第一個參數*str是用來存儲輸入行的數組名稱,第二個參數len是要讀取的字符數

輸入一行字符串,遇到換行符停止,保存時保存換行符 

getline(cin, *str)

獨屬於string類

輸入一行字符串,遇到換行符停止,保存時不保存換行符

 

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