云计算百科
云计算领域专业知识百科平台

C语言入门指南:从零到精通

十、字符函数和字符串函数

1.字符分类函数

        C语言提供了专门用来字符分类的函数。使用时需要包含头文件<ctype.h>。

函数为真返回非零值,为假返回0
iscntrl 任何控制字符
isspace 空白字符:空格' '、换页'\\f'、换行'\\n'、回车'\\r'、制表符'\\t'或者垂直制表符'\\v'
isdigit 十进制数字
isxdigit 十六进制数字
islower 小写字母a~z
isupper 大写字母A~Z
isalpha 字母a~z或A~Z
isalnum 字母或数字
ispunct 标点符号,任何不属于数字或字母的图形字符(可打印)
isgraph 任何图形字符
isprint 任何可打印字符,包括图形字符和空白字符

2.字符转换函数

        C语言还提供了2个字符转换函数:

int tolower (int c);//将大写字母转成小写字母

int toupper (int c);//将小写字母转成大写字母

3.strlen的使用和模拟实现

        (一)strlen函数:计算字符串长度

语法形式:

        size_t strlen (const char* str);

        *字符串,以'\\0'作为结束标志, strlen函数返回的是在字符串中'\\0'前面出现的字符个数,不包含'\\0'。
        *参数指向的字符串必须要以'\\0'结束,返回值为size_t是无符号的,strlen的使用需要包含头文件<string.h>。

        (二)strlen函数模拟实现

//计数器
int my_strlen(const char* p)
{
assert(p);
int count=0;
while(*p)
{
count++;
p++;
}
return count;
}
//递归
int my_strlen(const char* p)
{
assert(p);
if(*p=='\\0')
return 0;
else
return 1+my_strlen(p+1);
}
//指针-指针
int my_strlen(const char* p)
{
assert(p);
char *p1=p;
while(*p)
p++;
return p-p1;
}

4.strcpy的使用和模拟实现

        (一)strcpy函数:将一个字符串复制到另一个字符串中。

语法形式:

        char *strcpy(char *dest,const char *src);

        *源字符串必须以'\\0'结束,拷贝时源字符串中的'\\0'也要拷贝过去。
        *目标空间必须可以修改并且足够大,确保字符串顺利拷贝。
        *使用时需要包含头文件<string.h>。

        (二)strcpy函数模拟实现

#include <stdio.h>
#include <assert.h>
char *my_strcpy(char *dest,const char*src)
{
assert(dest&&src);
char *ret=dest;
while(*dest++==*src++)
;
return ret;
}
int main()
{
char str1[]="abcdef";
char str2[20];
char *str=my_strcpy(str1,str2);
printf("%s\\n",str1);
printf("%s\\n",str);
return 0;
}

5.strcat的使用和模拟实现

        (一)strcat函数:将一个字符串连接到另一个字符串的末尾。

语法形式:

        char *strcat(char *dest,const char *src);

        *源字符串必须以'\\0'结束,目标字符串也必须包含'\\0',否则追加时候不知道从哪里起始和结束。
        *目标空间必须可以修改并且足够大,确保字符串顺利追加。

        (二)strcat函数模拟实现

#include <stdio.h>
#include <assert.h>
char *my_strcat(char *dest,const char *src)
{
assert(dest&&src);
char *ret=dest;
while(*dest)
dest++;
while(*dest++=*src++)
;
return ret;
}
int main()
{
char str1[20]="abcdef";
char str2[]="ghijklmn";
char *str=my_strcat(str1,str2);
printf("%s\\n",str1);
printf("%s\\n",str);
return 0;
}

*该代码无法实现字符串追加本身。

6.strcmp的使用和模拟实现

        (一)strcmp函数:字符串比较函数

语法形式:

        int strcmp(const char *str1,const char *str2);

        *字符串要以'\\0'结束,两个字符串进行按位比较对应的ASCII值,str1大于str2,返回大于0的数字;str1等于str2,返回0;str1小于str2,返回小于0的数字。
        *使用时需要包含头文件<string.h>。

        (二)strcmp函数模拟实现

#include <stdio.h>
#include <assert.h>
int my_strcmp(const char *str1,const char *str2)
{
assert(str1&&str2);
while(*str1==*str2)
{
if(*str1=='\\0')
return 0;
str1++;
str2++;
}
return *str1-*str2;
}
int main()
{
char str1[]="abcdef";
char str2[]="abbcc";
int ret=my_strcmp(str1,str2);
printf("%d\\n",ret);
return 0;
}

7.strncpy的使用

        strncpy函数:从源字符串中拷贝指定数量的字符到目标字符串。

语法形式:

        char *strncpy(char *dest,const char *src,size_t n);

        *n是指定拷贝字符数,如果源字符串长度小于n,目标字符串将用‘\\0’填充至n个字符。如果源字符串的长度大于n,目标字符串可能不会以'\\0'结尾。

8.strncat的使用

        strncat函数:将源字符串的前n个字符追加到目标字符串的末尾。

语法形式:

        char *strncat(char *dest,const char *src,size_t n);

        *函数会自动在追加的字符后添加终止符'\\0'。
        *如果源字符串的长度小于n,只会将源字符串中到'\\0'的内容追加到目标字符串末尾。

9.strncmp的使用

        strncmp函数:比较两个字符串的前n个字符。

语法形式:

        int strncmp(const char *str1,const char *str2,size_t n);

        *比较在遇到空字符或比较完n个字符为止。
        *str1小于str2,返回小于0的值;str1等于str2,返回0;str1大于str2,返回大于0的值。

10.strstr的使用和模拟实现

       (一) strstr函数:查找子字符串在字符串中的首次出现位置。

语法形式:

        char *strstr(const char *str1,const char *str2);

        *如果找到子字符串,返回指向首次出现位置的指针。如果未找到,返回NULL。

        (二)strstr函数模拟实现

#include <stdio.h>
char* my_strstr(const char* str1,const char* str2)
{
char* s1=NULL;
char* s2=NULL;
char* cur=str1;
while(*cur)
{
s1=cur;
s2=str2;
while(*s1==*s2&&*s1!='\\0'&&*s2!='\\0')
{
s1++;
s2++;
}
if(*s2=='\\0')
return cur;
cur++;
}
return NULL;
}
int main()
{
char arr1[]="abbbcdef";
char arr2[]="bbcde";
char* ret=my_strstr(arr1,arr2);
if(ret!=NULL)
printf("%s\\n",ret);
else
printf("没找到\\n");
return 0;
}

11.strtok的使用

        strtok函数:字符串分割函数,用于将字符串按指定的分割符拆分为多个子字符串。

语法形式:

        char *strtok(char *str,const char *sep);

        *str待分割的字符串在首次调用时传入,后续调用传入NULL。strtok函数会返回下一个子字符串的指针,如果没有更多的字符串,返回NULL。
        *strtok函数找到str中的下一个标记,并用'\\0'结尾。strtok函数会改变待切分的字符串,所以被strtok函数切分的字符串一般都是临时拷贝的内容,并且可以修改。

12.strerror的使用

        strerror函数:将错误码转换为可读的错误信息字符串。

语法形式:

        char *strerror(int errnum);

errnum:错误码。(通常为errno的值)

        在不同的系统和C语言标准库的实现中,都规定了一些错误码,一般是放在这个<errno.h>头文件中说明的。C语言程序启动的时候就会使用一个全局变量errno来记录程序当前的错误码,只不过程序启动时错误码为0,表示没有错误。在使用标准库中的函数发生了某种错误,就会将对应的错误码放在这个变量中。而一个错误码的数字是整数,很难理解是什么意思,所以每一个错误码都是有对应的错误信息的。这个函数就可以将对应的错误信息字符串的地址返回。

*perror函数通常和错误码结合使用,perror可以根据errno的值,输出对应的错误描述信息。当perror的参数是一个自定义字符串时,会作为错误信息的前缀输出(再加上一个冒号和一个空格);如果参数是空指针,则进输出错误描述。

赞(0)
未经允许不得转载:网硕互联帮助中心 » C语言入门指南:从零到精通
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!