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 的指针。

注意事项:

  1. 当 src 的长度小于 n 时,dest 的剩余部分将用'\0'填充。
  2. 第三个参数 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 所指向的字符串进行比较。

返 回 值:

  1. 如果返回值小于 0,则表示 str1 小于 str2。
  2. 如果返回值大于 0,则表示 str1 大于 str2。
  3. 如果返回值等于 0,则表示 str1 等于 str2。

说 明:两个字符串自左向右逐个字符相比(按 ASCII 值大小相比较),直到出现不同的字符或遇 \0 为止。

1.6 strncmp

函数原型:int strcmp(const char *str1, const char *str2)。

功 能:把 str1 和 str2 进行比较,最多比较前 n 个字节。

返 回 值:

  1. 如果返回值小于 0,则表示 str1 小于 str2。
  2. 如果返回值大于 0,则表示 str1 大于 str2。
  3. 如果返回值等于 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 所指向的字符串不区分大小写的进行比较。

返 回 值:

  1. 如果返回值小于 0,则表示 str1 小于 str2。
  2. 如果返回值大于 0,则表示 str1 大于 str2。
  3. 如果返回值等于 0,则表示 str1 等于 str2。

1.8 strncasecmp

函数原型:int strncasecmp(const char *str1, const char *str2, size_t n)。

功 能:把 str1 所指向的字符串和 str2 所指向的字符串不区分大小写的进行比较,最多比较前 n 个字符。

返 回 值:

  1. 如果返回值小于 0,则表示 str1 小于 str2。
  2. 如果返回值大于 0,则表示 str1 大于 str2。
  3. 如果返回值等于 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 会被截断。

返 回 值:

  1. 如果格式化后的字符串长度小于 size,则会把字符串全部复制到 str 中,并给其后添加一个字符串结束符 \0。
  2. 如果格式化后的字符串长度大于等于 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 语言字符串操作总结的更多相关文章

  1. C语言字符串操作总结大全(超详细)

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作  strcpy(p, p1) 复制字符串  strncpy(p, p1, n) 复制指定长度字符串  strcat( ...

  2. C语言字符串操作常用库函数

    C语言字符串操作常用库函数 *********************************************************************************** 函数 ...

  3. c语言字符串操作大全

     C语言字符串操作函数 函数名: strcpy 功  能: 拷贝一个字符串到另一个 用  法: char *stpcpy(char *destin, char *source); 程序例: #incl ...

  4. 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

    转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...

  5. C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

    原文:http://www.cnblogs.com/JCSU/articles/1305401.html C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. ...

  6. 零基础学习C语言字符串操作总结大全

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, ...

  7. C语言 字符串操作 笔记

    /* C语言字符串的操作笔记 使用代码和注释结合方式记录 */ # include <stdio.h> # include <string.h> int main(void) ...

  8. 6. Go语言—字符串操作

    一.字符串支持的转义字符 \r 回车符(返回行首) \n 换行符(直接跳到下一行的同列位置) \t 制表符 \' 单引号 \" 双引号 \\ 反斜杠 \uXXXX Unicode字符码值转义 ...

  9. C语言字符串操作总结大全

    1)字符串操作 strcpy(p, p1)  复制字符串  函数原型strncpy(p, p1, n)   复制指定长度字符串  函数原型strcat(p, p1)   附加字符串  函数原型strn ...

  10. C语言 字符串操作两头堵模型

    //字符串操作两头堵模型练习 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #inc ...

随机推荐

  1. WPF内嵌Http协议的Server端

    需求:有时后比如WPF,WinForm,Windows服务这些程序可能需要对外提供接口用于第三方服务主动通信,调用推送一些服务或者数据. 想到的部分实现方式: 一.使用Socket/WebSocket ...

  2. TienChin 渠道管理-表创建

    在若依当中,有个槽点,就是数据库当中的删除标识状态一般 0 是 false,1 是 true,在若依当中反而 0 是 true,1 是 false. 渠道表设计,我这里就直接贴成品的创建表 SQL: ...

  3. 中文LLaMA模型和指令精调的Alpaca大模型:中文数据进行二次预训练

    中文LLaMA模型和指令精调的Alpaca大模型:中文数据进行二次预训练,进一步提升了中文基础语义理解能力 以ChatGPT.GPT-4等为代表的大语言模型(Large Language Model, ...

  4. 强化学习从基础到进阶-案例与实践[3]:表格型方法:Sarsa、Qlearning;蒙特卡洛策略、时序差分等以及Qlearning项目实战

    强化学习从基础到进阶-案例与实践[3]:表格型方法:Sarsa.Qlearning:蒙特卡洛策略.时序差分等以及Qlearning项目实战 策略最简单的表示是查找表(look-up table),即表 ...

  5. 希捷推出IronWolf Pro 24TB硬盘:CMR构建、285MB/s传输速率

    希捷推出了全新IronWolf Pro 24TB硬盘,采用3.5寸规格,满足中小企业和NAS环境需求. 据了解,新款硬盘采用了希捷AgileArray技术,针对NAS系统进行了优化.其通过双平面平衡和 ...

  6. 金邦2.5寸SATA固态硬盘R3 2TB开箱

    上次帖子里根据坛友的反馈,然后结合狗东的搜索,找了个金邦的2.5寸的SATA的固态硬盘,图的是它的价格和容量.但是我拿到它这个实物的时候还是略有点失望,因为包装太简单,坛友里说估计是贴牌.反正已经入手 ...

  7. 【算法】C语言程序编程模拟实现strlen函数和strcpy函数

    C语言程序编程模拟实现strlen函数和strcpy函数(超详细的注释和解释) 求个赞求个赞求个赞求个赞 谢谢 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说 ...

  8. 教你用JavaScript实现搜索展开

    欢迎来的我的小院,恭喜你今天又要涨知识了! 案例内容 利用JavaScript实现搜索框的移动展开. 演示 学习 <!DOCTYPE html> <html lang="e ...

  9. (C语言)我的第一个项目:命令行窗口下的学生成绩管理系统,及数据生成程序

    学生成绩管理系统 页面效果如图: 代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> ...

  10. jackson、objectMapper 、JsonAlias、JsonProperty、json。序列化和反序列化研究。

    总结: @JsonAlias:序列化出来是一定是真名,反序列化时可以传真名(驼峰)Json也可以传别名(下划线)Json @JsonProperty:序列化出来一定是别名,反序列化时也只能传别名Jso ...