(超全,超经典)字符串函数与易错点

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.字符处理函数库

头文件使用字符处理函数库

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.字符串转换函数

头文件需要使用通用工具函数库

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.标准输入/输出库函数

头文件使用标准输入/输出库

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.字符串处理函数库中的字符串处理函数

头文件使用字符串处理函数库

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.字符串处理函数库中的比较函数

头文件使用字符串处理函数库

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.字符串处理函数库中的查找函数

头文件使用字符串处理函数库

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类

输入一行字符串,遇到换行符停止,保存时不保存换行符

 

你可能感兴趣的:(C语言,与,C++)