C 语言字符串操作总结
C 语言字符串操作总结
一、字符串操作
size_t 是一个无符号整型。
1.1 strcpy
函数原型:char *strcpy(char *dest, const char *src)。
功 能:把 src 所指向的字符串复制到 dest 中。
返 回 值:该函数返回一个指向最终的目标字符串 dest 的指针。
注意事项:需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。
#include <stdio.h>
#include <string.h>
#define STRING_LEN_24 24
int main()
{
char src[] = "hello world";
char dest[STRING_LEN_24];
char *buf = strcpy(dest, src);
// buf == dest, hello world
puts(buf);
puts(dest);
return 0;
}
1.2 strncpy
函数原型:char *strncpy(char *dest, const char *src, size_t n)。
功 能:把 src 所指向的字符串复制到 dest,最多复制 n 个字符。
返 回 值:该函数返回一个指向最终的目标字符串 dest 的指针。
注意事项:
- 当 src 的长度小于 n 时,dest 的剩余部分将用
'\0'填充。 - 第三个参数 size_t 一般设置为目标字符串 dest 的长度 - 1,因为要空出一位放置
'\0'。
#include <stdio.h>
#include <string.h>
#define STRING_LEN_24 24
int main()
{
char src[] = "hello world";
char dest[STRING_LEN_24];
char *buf = strncpy(dest, src, STRING_LEN_24 - 1);
// buf == dest
puts(buf);
puts(dest);
return 0;
}
1.3 strcat
函数原型:char *strcat(char *dest, const char *src)。
功 能:把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
返 回 值:该函数返回一个指向最终的目标字符串 dest 的指针。
注意事项:确保目标数组 dest 有足够的空间容纳 src。
#include <stdio.h>
#include <string.h>
#define STRING_LEN_24 24
int main()
{
char src[] = "hello world";
char dest[STRING_LEN_24] = "ABCDE";
char *buf = strcat(dest, src);
// buf == dest, ABCDEhello world
puts(buf);
puts(dest);
return 0;
}
1.4 strncat
函数原型:char *strncat(char *dest, const char *src, size_t n)。
功 能:把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,最大复制 n 字符长度。
返 回 值:该函数返回一个指向最终的目标字符串 dest 的指针。
注意事项:第三个参数要确保不会溢出 dest,建议传入 dest 的剩余空间 - 1。
#include <stdio.h>
#include <string.h>
#define STRING_LEN_16 16
int main()
{
char src[] = "hello world";
char dest[STRING_LEN_16] = "ABCDE";
// 第三个参数:dest 剩余可支配空间 - 1, 也就是 16 - 5 - 1 = 10
char *buf = strncat(dest, src, STRING_LEN_16 - strlen(dest) - 1);
// buf == dest, ABCDEhello worl
puts(buf);
puts(dest);
return 0;
}
1.5 strcmp
函数原型:int strcmp(const char *str1, const char *str2)。
功 能:把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
返 回 值:
- 如果返回值小于 0,则表示 str1 小于 str2。
- 如果返回值大于 0,则表示 str1 大于 str2。
- 如果返回值等于 0,则表示 str1 等于 str2。
说 明:两个字符串自左向右逐个字符相比(按 ASCII 值大小相比较),直到出现不同的字符或遇 \0 为止。
1.6 strncmp
函数原型:int strcmp(const char *str1, const char *str2)。
功 能:把 str1 和 str2 进行比较,最多比较前 n 个字节。
返 回 值:
- 如果返回值小于 0,则表示 str1 小于 str2。
- 如果返回值大于 0,则表示 str1 大于 str2。
- 如果返回值等于 0,则表示 str1 等于 str2。
说 明:自左向右比较前 n 个字符,直到出现不同的字符或遇 \0 为止。
strncmp()函数首先将 str1 字符串的第一个字符的 ACSII 值减去 str2 第一个字符的 ACSII 值:1. 若差值为零则继续比较下去;2. 若差值不为零,则返回差值。
1.7 strcasecmp
函数原型:int strcasecmp(const char *s1, const char *s2)。
功 能:把 str1 所指向的字符串和 str2 所指向的字符串不区分大小写的进行比较。
返 回 值:
- 如果返回值小于 0,则表示 str1 小于 str2。
- 如果返回值大于 0,则表示 str1 大于 str2。
- 如果返回值等于 0,则表示 str1 等于 str2。
1.8 strncasecmp
函数原型:int strncasecmp(const char *str1, const char *str2, size_t n)。
功 能:把 str1 所指向的字符串和 str2 所指向的字符串不区分大小写的进行比较,最多比较前 n 个字符。
返 回 值:
- 如果返回值小于 0,则表示 str1 小于 str2。
- 如果返回值大于 0,则表示 str1 大于 str2。
- 如果返回值等于 0,则表示 str1 等于 str2。
1.9 strspn
函数原型:size_t strspn(const char *str1, const char *str2)。
功 能:检索字符串 str1 开头连续有几个字符都出现在字符串 str2 中的字符个数。
返 回 值:该函数返回 str1 中第一个不在字符串 str2 中出现的字符下标。
举个例子:
| str1 | str2 | 返回值 | 说明 |
|---|---|---|---|
| abcdefg | abcd | 4 | e 是第一个未出现的,返回其下标 4 |
| abcdefg | acde | 1 | b 是第一个未出现的,返回其下标 1 |
| abcdefg | abcdefg | 7 | 全都存在,返回 str1 的长度 |
1.10 strcspn
函数原型:size_t strcspn(const char *str1, const char *str2)。
功 能:检索字符串 str1 开头连续有几个字符都没有出现在字符串 str2 中的字符个数,与函数 strspn 的作用刚好相反。
返 回 值:返回 str1 开头连续都不含字符串 str2 中字符的字符数。
举个例子:
| str1 | str2 | 返回值 | 说明 |
|---|---|---|---|
| abcdefg | defg | 3 | 字符 a、b、c 未出现 |
| abcdefg | aXYG | 0 | 首字符 a 就出现了 |
| abcdefg | XYG | 7 | 全都不存在 |
- c : complementary,互补的
- spn:span,跨度
二、格式化输出
2.1 sprintf
函数原型:int sprintf(char *str, const char *format, ...)。其中 ... 省略的是与 format 相匹配的参数们。
功 能:将格式化后的字符串保存到 str 所指向的字符串中。
返 回 值:如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。
注 意:确保 str 空间足够大,不要溢出。
#include <stdio.h>
#include <string.h>
#define STRING_LEN_64 64
int main()
{
char str1[] = "hello world";
char str2[] = "how are you";
char str[STRING_LEN_64];
int n = sprintf(str, "str1[%s], str2[%s]", str1, str2);
// 输出:str1[hello world], str2[how are you], 36
printf("%s, %d\n", str, n);
return 0;
}
类比 printf,区别在于 printf 是输出到屏幕上,而 sprintf 输出到字符串 str 中。
2.2 snprintf
函数原型:int snprintf(char *str, size_t size, const char *format, ...)。
功 能:将可变参数 ... 按照 format 格式化成字符串,并保存到 str 中,size 为要写入的字符的最大数目,超过 size 会被截断。
返 回 值:
- 如果格式化后的字符串长度小于 size,则会把字符串全部复制到 str 中,并给其后添加一个字符串结束符 \0。
- 如果格式化后的字符串长度大于等于 size,超过 size 的部分会被截断,只将其中的 size - 1 个字符复制到 str 中,并给其后添加一个字符串结束符 \0,返回值为欲写入的字符串长度。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define STRING_LEN_16 16
int main()
{
char str1[] = "hello world";
char str2[] = "how are you";
char str[STRING_LEN_16];
// 第二个参数传入字符串总大小即可,因为如果格式化后的字符串长度 >= size 的话,只保留 size - 1 个字符
int n = snprintf(str, STRING_LEN_16, "str1[%s], str2[%s]", str1, str2);
// 输出:str1[hello wor, 36
printf("%s, %d\n", str, n);
return 0;
}
通过输出 n 可验证,该函数返回值为欲写入的字符串长度,而不是写入的长度。
参考资料
C 语言字符串操作总结的更多相关文章
- C语言字符串操作总结大全(超详细)
本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat( ...
- C语言字符串操作常用库函数
C语言字符串操作常用库函数 *********************************************************************************** 函数 ...
- c语言字符串操作大全
C语言字符串操作函数 函数名: strcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #incl ...
- 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文
转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...
- C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文
原文:http://www.cnblogs.com/JCSU/articles/1305401.html C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. ...
- 零基础学习C语言字符串操作总结大全
本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, ...
- C语言 字符串操作 笔记
/* C语言字符串的操作笔记 使用代码和注释结合方式记录 */ # include <stdio.h> # include <string.h> int main(void) ...
- 6. Go语言—字符串操作
一.字符串支持的转义字符 \r 回车符(返回行首) \n 换行符(直接跳到下一行的同列位置) \t 制表符 \' 单引号 \" 双引号 \\ 反斜杠 \uXXXX Unicode字符码值转义 ...
- C语言字符串操作总结大全
1)字符串操作 strcpy(p, p1) 复制字符串 函数原型strncpy(p, p1, n) 复制指定长度字符串 函数原型strcat(p, p1) 附加字符串 函数原型strn ...
- C语言 字符串操作两头堵模型
//字符串操作两头堵模型练习 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #inc ...
随机推荐
- WPF内嵌Http协议的Server端
需求:有时后比如WPF,WinForm,Windows服务这些程序可能需要对外提供接口用于第三方服务主动通信,调用推送一些服务或者数据. 想到的部分实现方式: 一.使用Socket/WebSocket ...
- TienChin 渠道管理-表创建
在若依当中,有个槽点,就是数据库当中的删除标识状态一般 0 是 false,1 是 true,在若依当中反而 0 是 true,1 是 false. 渠道表设计,我这里就直接贴成品的创建表 SQL: ...
- 中文LLaMA模型和指令精调的Alpaca大模型:中文数据进行二次预训练
中文LLaMA模型和指令精调的Alpaca大模型:中文数据进行二次预训练,进一步提升了中文基础语义理解能力 以ChatGPT.GPT-4等为代表的大语言模型(Large Language Model, ...
- 强化学习从基础到进阶-案例与实践[3]:表格型方法:Sarsa、Qlearning;蒙特卡洛策略、时序差分等以及Qlearning项目实战
强化学习从基础到进阶-案例与实践[3]:表格型方法:Sarsa.Qlearning:蒙特卡洛策略.时序差分等以及Qlearning项目实战 策略最简单的表示是查找表(look-up table),即表 ...
- 希捷推出IronWolf Pro 24TB硬盘:CMR构建、285MB/s传输速率
希捷推出了全新IronWolf Pro 24TB硬盘,采用3.5寸规格,满足中小企业和NAS环境需求. 据了解,新款硬盘采用了希捷AgileArray技术,针对NAS系统进行了优化.其通过双平面平衡和 ...
- 金邦2.5寸SATA固态硬盘R3 2TB开箱
上次帖子里根据坛友的反馈,然后结合狗东的搜索,找了个金邦的2.5寸的SATA的固态硬盘,图的是它的价格和容量.但是我拿到它这个实物的时候还是略有点失望,因为包装太简单,坛友里说估计是贴牌.反正已经入手 ...
- 【算法】C语言程序编程模拟实现strlen函数和strcpy函数
C语言程序编程模拟实现strlen函数和strcpy函数(超详细的注释和解释) 求个赞求个赞求个赞求个赞 谢谢 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说 ...
- 教你用JavaScript实现搜索展开
欢迎来的我的小院,恭喜你今天又要涨知识了! 案例内容 利用JavaScript实现搜索框的移动展开. 演示 学习 <!DOCTYPE html> <html lang="e ...
- (C语言)我的第一个项目:命令行窗口下的学生成绩管理系统,及数据生成程序
学生成绩管理系统 页面效果如图: 代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> ...
- jackson、objectMapper 、JsonAlias、JsonProperty、json。序列化和反序列化研究。
总结: @JsonAlias:序列化出来是一定是真名,反序列化时可以传真名(驼峰)Json也可以传别名(下划线)Json @JsonProperty:序列化出来一定是别名,反序列化时也只能传别名Jso ...