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. go中channel源码剖析

    channel 前言 设计的原理 共享内存 csp channel channel的定义 源码剖析 环形队列 创建 写入数据 读取数据 channel的关闭 优雅的关闭 M个receivers,一个s ...

  2. 文字溢出hover展示

    我这个后端返回的是html结构,不然不用加v-html,需要依赖element Ui 的文字提示 <el-tooltip placement="top"> <p ...

  3. 21.14 Python 实现Web指纹识别

    在当今的Web安全行业中,识别目标网站的指纹是渗透测试的常见第一步.指纹识别的目的是了解目标网站所使用的技术栈和框架,从而进一步根据目标框架进行针对性的安全测试,指纹识别的原理其实很简单,目前主流的识 ...

  4. C/C++ 通过CRC32实现反破解

    我们可以通过使用CRC32算法计算出程序的CRC字节,并将其写入到PE文件的空缺位置,这样当程序再次运行时,来检测这个标志,是否与计算出来的标志一致,来决定是否运行程序,一旦程序被打补丁,其crc32 ...

  5. SDK多项目开发与联调

    在SDK开发中,因为是往外提供的功能静态库,所以在开发的时候要验证开发的SDK是否功能正常,这里就需要做进行边开发边联调的工作. 下面使用的开发模式是创建一个WorkSpace工作工具,SDK项目和D ...

  6. P3509 [POI2010] ZAB-Frog 题解

    题目链接:ZAB-Frog 基于一个根据距离第 \(k\) 大的事实: 容易知道,对于红色的点而言,与它相近最近的 \(k\) 个点是连续的.而第 \(k\) 远的要么是最左侧要么是最右侧.而我们注意 ...

  7. C++自定义sort比较函数的四种方法

    sort函数:对于容器等进行排序,头文件位于<algorithm>中. 普通:可以在sort的第三个参数传入 无参:default = less<>() less<> ...

  8. Elasticsearch不同集群间备份恢复(S3存储)

    S3存储 首先都知道需要在ES集群上安装S3插件以及重启集群 在MINIO集群创建相应的桶 Kibana上注册快照存储库,两个不同的集群需要对接到同一个S3存储库,对接后会自动识别桶里的快照 < ...

  9. 从零开始手写缓存框架(二)redis expire 过期原理及实现

    前言 我们在 从零手写 cache 框架(一)实现固定大小的缓存 中已经初步实现了我们的 cache. 本节,让我们来一起学习一下如何实现类似 redis 中的 expire 过期功能. 过期是一个非 ...

  10. spring boot整合spring security自定义登录跳转地址

    说明 在博客用户登录后我想跳转到各自用户的博客首页,我们知道这个地址是动态的. 例如: http://localhost:8080/blog/zhangsan, 每个用户地址不一样.这时候我就用到了自 ...