C语言中的字符串处理库函数介绍与实现

一、介绍

本文将主要介绍字符串处理库函数中的strlen、strcpy、strcat、strcmp、atoi等,主要由<string.h>头文件提供。

二、strlen函数:求字符串的长度

strlen

头文件

#include<string.h>

原型

size_t strlen(const char *s)

说明

求出s指向的字符串的长度(不包括null字符)。

返回值

返回s指向的字符串的长度。

size_t strlen(const char *s)
{
    size_t len = 0;
    while(*s++)
        len++;
    return len;
}

二、strcpy和strncpy函数:复制字符串

strcpy

头文件

#include<string.h>

原型

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

说明

将s2指向的字符串复制到s1指向的数组中。若s1和s2指向的内存空间重叠,则作未定义处理。

返回值

返回s1的值。

strncpy

头文件

#include<string.h>

原型

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

说明

将s2指向的字符串复制到s1指向的数组中。若s2的长度大于等于n,则复制到第n个字符为止。否则用null字符填充剩余部分。若s1和s2指向的内存空间重叠,则作未定义处理。

返回值

返回s1的值。

char *strcpy(char *s1,const char *s2)
{
    char *tmp = s1;
    while(*s1++ = *s2++)
        ;
    return tmp;
}

char *strncpy(char *s1,const char *s2,size_t n)
{
    char *tmp = s1;
    while(n){
        if(!(*s1++ = *s2++)) break;  //遇到'\0'就结束循环
        n--; 
    }
    while(n--)
    *s1++ = '\0';  //用'\0'填充剩余部分
    return tmp; 
}

三、strcat和strncat函数:连接字符串

strcat

头文件

#include<string.h>

原型

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

说明

将s2指向的字符串连接到s1指向的末尾。若s1和s2指向的内存空间重叠,则作未定义处理

返回值

返回s1的值。

strncat

头文件

#include<string.h>

原型

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

说明

将s2指向的字符串连接到s1指向的数组末尾。若s2的长度大于n则截断超出部分。若s1和s2指向的内存空间重叠,则作未定义处理。

返回值

返回s1的值。

char *strcat(char *s1,const char *s2)
{
    char *tmp = s1;
    while(*s1)
        s1++;  //前进到s1的末尾处 
    while(*s1++ = *s2++)
        ;  //循环复制直至遇到s2中的'\0' 
    return tmp;
}

char *strncat(char *s1,const char *s2,size_t n)
{
    char *tmp = s1;
    while(*s1)
        s1++;  //前进到s1的末尾处 
    while(n--)
        if(!(*s1++ = *s2++)) break;  //遇到'\0'就结束循环 
    *s1 = '\0';  //在s1的末尾插入'\0' 
    return tmp; 
}

四、strcmp和strncmp函数:比较字符串的大小关系

strcmp

头文件

#include<string.h>

原型

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

说明

比较s1指向的字符串和s2指向的字符串的大小关系。

返回值

若s1和s2相等,则返回0;若s1大于s2,则返回正整数值,反之返回负整数值。

strncmp

头文件

#include<string.h>

原型

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

说明

比较s1指向的字符的数组和s2指向的字符的数组的前n个字符的大小关系。

返回值

若s1和s2相等,则返回0;若s1大于s2,则返回正整数值,反之返回负整数值。

int *strcmp(char *s1,const char *s2)
{
    while(*s1 == *s2){
        if(*s1 == '\0')
            return 0;
        s1++;
        s2++;
    }
    return (unsigned char)*s1 - (unsigned char)*s2;
}

int *strncmp(char *s1,const char *s2,size_t n)
{
    while(n && *s1 && *s2){
        if(*s1 != *s2)
            return (unsigned char)*s1 - (unsigned char)*s2;
        s1++;
        s2++;
        n--;
    }
    if(!n) return 0;  //相等 
    if(*s1) return 1;  //s1 > s2
    
    return -1;    //s1 < s2
}

五、atoi、atol和atof函数:转换字符串

atoi

头文件

#include<stdlib.h>

原型

int atoi(const char *nptr)

说明

将nptr指向的字符串转换为int型表示

返回值

返回转换后的值。结果值不能用int型表示时的处理未定义。

atol

头文件

#include<stdlib.h>

原型

long atol(const char *nptr)

说明

将nptr指向的字符串转换为long型表示

返回值

返回转换后的值。结果值不能用long型表示时的处理未定义。

atof

头文件

#include<stdlib.h>

原型

double atof(const char *nptr)

说明

将nptr指向的字符串转换为double型表示

返回值

返回转换后的值。结果值不能用double型表示时的处理未定义。

//使用atoi函数的例子

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
    char str[128];
    printf("请输入字符串:");
    scanf("%s",str);
    
    printf("转换为整数后为%d。\n",atoi(str));
    return 0;
 } 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏听雨堂

简单分页的性能优化

采用网上常见的分页方式,在sqlserver事件分析器中观察,发现 ? 几个主要的sql查询中,耗费最大的是查询所有的记录数。 将其从分页程序中剔除,前后的效果...

1779
来自专栏闵开慧

map函数或reduce函数中如何调用第三方jar包

    一般我们在mapreduce程序中调用第三方jar包时会出现找不到jar包的问题,检查发现jar包就在相应路径,mapreduce任务就是找不到。仔细想...

3045
来自专栏数据结构与算法

03:八进制小数

03:八进制小数 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB描述 八进制有限小数均可以用十进制有限小数精确地表示。比如,八...

3347
来自专栏Golang语言社区

go 内置函数

Go 的内置函数不拥有前面提到的go的标准类型,因此内置函数不能作为一个函数值赋值给函数类型的变量。 close close用于关闭一个channel,使用c...

3105
来自专栏GreenLeaves

JavaScript之字符串引号的使用技巧

在JavaScript中可以随意使用引号,但是最好根据字符串包含的字符来选择。 1.如果字符串里面包含了单引号,那就把字符串放在双引号里面 var age = ...

1727
来自专栏电光石火

PHP获取时间戳的毫秒

php获取时间的方式是time(); 那么如果是涉及需要精细的时间的应用,那么怎么获取呢? /** 获取当前时间戳,精确到毫秒 */ functi...

1939
来自专栏IT笔记

JAVA中基本数据类型和引用数据类型特点

特点: 一、从概念方面来说 基本数据类型:变量名指向具体的数值 引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值 二、从内存构建方面来说...

2578
来自专栏机器学习实践二三事

python基础----map和reduce

map和reduce Map简单来说就是:一个映射函数就是对一些独立元素组成的概念上的列表的每一个元素进行指定的操作 Reduce简单来说就是:对一个列表的...

1706
来自专栏Linux驱动

指针学习(详解)

在指针中*是取内容,&是取地址 (在结构体中时:变量结构体用".",指针结构体用"->") 通常有两种的表示: 1. 通过指针向指向的地址内容赋值 *p=a;...

1605
来自专栏运维技术迷

Redis数据结构和内部编码

type命令时间返回的就是当前键的 数据结构类型,分别为:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合),但是...

3799

扫码关注云+社区