【C】C语言中的字符串操作函数

标准库默认集合的不安全性

它们使代码包含错误的可能性很大;在网络环境下使用,它们允许恶意代码破坏程序。

主要原因是,无法验证数组有足够的空间执行操作。


C11可选版本

它们会检查数组的维数,确保它们足够大。相比较标准库,主要是添加了数组大小的参数。


检查对C11的支持

编译并执行下列代码

#include<stdio.h>

int main()
{
#if defined_STDC_LIB_EXT1_
    printf("Optional functions are defined.\n");
#else
    printf("Optional functions are not defined.\n");
#endif // defined_STDC_LIB_EXT1_

    return 0;
}
要使用string.h中的可选函数,必须在string.h的include语句之前,在源文件中定义_STDC_WANT_LIB_EXT1_符号,来表示值1,如下所示:
#define _STDC_WANT_LIB_EXT1_ 1
#include<string.h>
使用这个机制的原因是,它不会中断推出C11标准之前编写的旧代码。

把_STDC_WANT_LIB_EXT1_定义为0,就可以禁用可选函数。


字符串操作

头文件

#include<string.h>


确定字符串的长度

可选函数:size_t strnlen_s(字符串的地址,数组的大小)

返回值:字符串的大小

知道数组的大小,若字符串结尾没有'\0',函数就可以避免访问最后一个元素后面的内存。


标准函数:strlen(字符串的地址)


复制字符串

可选函数:int strcpy_s(目标字符串的地址,第一个参数的大小,源字符串的地址)

返回值:如果一切正常,就返回0,否则返回非0整数值

指定字符串的长度,就可以避免函数覆盖字符串中最后一个字符后面的内存


可选函数:strncpy_s(目标字符串的地址,第一个参数的大小,源字符串的地址,复制的最大字符数)

如果在复制指定的最大字符数之前,在源字符串中找到了'\0',复制就停止,并把'\0'添加到目标字符串的末尾


标准函数:strcpy(目标字符串地址,源字符串地址)


连接字符串

可选函数:strcat_s(要添加新字符串的字符串地址,第一个参数的大小,要添加到第一个参数中的字符串地址)

返回值:如果一切正常就返回0

该操作把str2复制到str1的末尾,覆盖str1中的'\0',再在最后添加一个'\0'


可选函数:strncpy_s(要添加新字符串的字符串地址,第一个参数的大小,要添加到第一个参数中的字符串地址,要连接的最大字符数)

该函数把str2的一部分连接到str1上


标准函数:strcat(str1,str2)


比较字符串

标准函数:strcmp(str1,str2)

返回值:返回一个小于、等于或大于0的值,分别对应str1小于、等于和大于str2

没有可选函数


标准函数:strncmp(str1,str2,指定要比较的字符数)


搜索字符串

搜索字符串中的一个字符

标准函数:strchr(要搜索的字符串,(int类型)要查找的字符)

返回值:从字符串的开头开始搜索,返回在字符串中找到的第一个给定字符的地址。如果没有找到,就返回NULL


标准函数:strrchr(要搜索的字符串,要查找的字符)

返回值:返回字符串中最后一个给定字符串的地址,如果找不到就返回NULL

从字符串的末尾开始查找

在字符串中查找子字符串

标准函数:strstr(要搜索的字符串,要查找的子字符串)

返回值:返回找到的第一个子字符串的位置指针。如果找不到就返回NULL


单元化字符串

可选函数:(第一次调用)strtok_s(要单元化的字符串的地址,数组大小,所有可能界定符的字符串的地址,指向char*的指针)

                   (后续调用)strtok_s(NULL,数组大小,所有可能界定符的字符串的地址,指向char*的指针)

返回值:返回char*类型的指针,指向标记的第一个字符,如果没有找到就返回NULL


分析和转换字符串

转换字符的大小写形式

头文件:ctype.h

标准函数:toupper(字母),tolower(字母)

返回值:返回转换后的int类型字符

将字符串转换成数值

头文件:stdlib.h

标准函数                     返回值

atof()                           从字符串中生成的double类型的值。double值“无穷大”表示为INF或INFINITY,“not a number”表示为NAN

atoi()                           从字符串中生成的int类型的值

atol()                           从字符串中生成的long类型的值

atoll()                          从字符串中生成的long long类型的值

这4个函数会忽略前导空白,也忽略不能构成数值一部分的字符后面的所有字符

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值