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. 【深度学习项目二】卷积神经网络LeNet实现minst数字识别

    相关文章: [深度学习项目一]全连接神经网络实现mnist数字识别 [深度学习项目二]卷积神经网络LeNet实现minst数字识别 [深度学习项目三]ResNet50多分类任务[十二生肖分类] 『深度 ...

  2. Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--打开大文件处理

    项目地址: Pdfium.Net:https://github.com/1000374/Pdfium.Net PdfiumViewer:https://github.com/1000374/Pdfiu ...

  3. Walrus 实用教程|Walrus + Gitlab,打通CI/CD 自动化交付!

    Walrus file 是 Walrus 0.5 版本推出的新功能,用户可以通过一个非常简洁的 YAML 描述应用或基础设施资源的部署配置,然后通过 Walrus CLI 执行 walrus appl ...

  4. SDK多项目开发与联调

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

  5. docker 安装的jenkins如何执行宿主机的shell启动jar包

    最近在用docker做自动化部署的时候遇到一个问题,就是用docker装的jenkins可以通过映射执行宿主机脚本.但是,却无法通过shell脚本启动宿主机jar包.经排查最终用以下方案完美解决. 一 ...

  6. 【题解】U405180 计算平方和

    \(\bold{Part\ 0}\) 目录 \(/\ \bold{Contents}\) \(\bold{Part\ 1}\) 题目大意 \(/\ \bold{Item\ content}\) \(\ ...

  7. Git操作--Pycharm

    声明: 1)仅作为个人学习,如有冒犯,告知速删! 2)不想误导,如有错误,不吝指教! 一--在idea中配置git: 1. 更改git的安装路径:file-->settings,找到versio ...

  8. JS Leetcode 26. 删除有序数组中的重复项 题解分析,字典与快慢双指针

    壹 ❀ 引 本题来自LeetCode26. 删除有序数组中的重复项,是一道简单题,题目描述如下: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组 ...

  9. Linux 中竖线“|”与双竖线“||”的意思

    linux中竖线'|',双竖线'||',&和&&的意思 对于初学者来说这几个意思可能只知道其中几个的意思,下面我们来看一下. 1.竖线'|' ,在linux中是作为管道符的,将 ...

  10. 对称加密算法汇总:AES DES 3DES SM4 java 实现入门

    密码的世界 如果你是黑帮老大,平时和手下沟通,如何保证自己的信息安全呢? 在神探夏洛克的第一季中,就讲述了一个如何侦破黑帮的加密交流的故事. 这种密码利用的是密码字典. 密码本身可以是一本书,比如常见 ...