当前位置: 首页 > news >正文

字符串函数———C语言

1. 求字符串的长度

strlen

原型:size_t strlen(const char *str);

原理:字符串以'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包括'\0')参数指向的字符串必须要以'\0'结束

#include <stdio.h>
#include <string.h>
int main(){char a[] = "bvsklvjrughkvsknln";//这里就是一个字符串了printf("The strlen of a = %d",strlen(a));return 0;
}

注意:函数的返回值为size_t,是无符号的(unsigned int)

2. 长度不受限制的字符串函数

a:strcpy

原型:char * strcpy ( char * destination, const char * source );

原理:strcpy 会从源字符串 src 开始,一个字符一个字符地复制到目标字符串 dest 中,直到遇到字符串结束符 \0,然后在 dest 也追加一个 \0 来标识字符串的结束。

目标空间(即 dest不可变化,必须在复制操作前预先分配足够的内存空间。如果目标空间的大小不足以容纳源字符串,则可能导致缓冲区溢出等严重错误。

#include <stdio.h>
#include <string.h>
int main() {char src[] = "Hello, World!";char dest[50];  // 确保目标缓冲区足够大,能够容纳源字符串strcpy(dest, src);printf("Copied string: %s\n", dest);return 0;
}

b:strcat

原型:char * strcat ( char * destination, const char * source );

原理:strcat 从目标字符串 dest 的末尾(即第一个 \0 位置)开始,将源字符串 src 逐字符追加到 dest 后面,并在连接后的字符串末尾添加一个新的 \0 结束符。

注意:使用 strcat 时,目标字符串 dest 必须预留足够的空间, 以便容纳追加后的字符串。 由于strcat 不会自动检查 dest 的剩余空间是否足够,可能会导致缓冲区溢出和潜在的程序崩溃。  

#include <stdio.h>
#include <string.h>
int main() {char dest[50] = "Hello, ";  // 确保 dest 的大小足够容纳两个字符串char src[] = "World!";strcat(dest, src);printf("Concatenated string: %s\n", dest);return 0;
}

c:strcmp

原型:int strcmp ( const char * str1, const char * str2 );

原理:

  • 第一个字符串大于第二个字符串时,则返回大于0的数字
  • 第一个字符串等于第二个字符串时,则返回0
  • 第一个字符串小于第二个字符串时,则返回小于0的数字
#include <stdio.h>
#include <string.h>
int main(){char a[] = "bvsklvjrughkvsknln";char b[] = "bvsklvjrughkvsknln";printf("The strlen of a = %d\n",strlen(a));printf("The strlen of a = %d\n",strlen(b));printf("strcmp = %d\n",strcmp(a,b));//返回结果是0return 0;
}

3. 长度受限制的字符串函数

1.strncpy

原型:char * strncpy ( char * destination, const char * source, size_t num );

原理:拷贝num个字符从源字符串到目标空间,如果源字符串的长度小于num,则补'\0'

#include <stdio.h>
#include <string.h>
int main() {char str[256] = { 0 };char str1[] = "hello";char str2[] = "delicious";printf("str2=%s", str2);//说明把之前的替换了// 复制hellstrncpy(str, str1, 4);printf("str=%s\n", str);// 复制hello\0\0strncpy(str2, str1, 7);printf("str2=%s", str2);// helloreturn 0;
}

2.strncat

原型:char * strncat ( char * destination, const char * source, size_t num );

原理:将一个字符串的指定数量的字符追加到另一个字符串的末尾。与 strcat() 不同的是,strncat() 限制了追加的字符数量,防止超出目标字符串的缓冲区大小。

#include <stdio.h>
#include <string.h>
int main() {char str[256] = "hello\0xxxxxxxxxx";char str1[] = "world";// 拷贝str1的3个字符到str的结尾strncat(str,str1,3);printf("str=%s\n",str);// helloworreturn 0;
}

3.strncmp

原型:int strncmp ( const char * str1, const char * str2, size_t num );

原理:比较两个字符串的前 n 个字符(有一定的限制才能防止内存溢出)与 strcmp() 函数不同,strncmp() 允许你指定比较的字符数,帮助你在部分字符串中进行比较。

#include <stdio.h>
#include <string.h>
int main() {char str1[] = "Hello, World!";char str2[] = "Hello, everyone!";   // 比较前 5 个字符int result = strncmp(str1, str2, 5);    if (result == 0) {printf("The first 5 characters are the same.\n");} else if (result < 0) {printf("str1 is less than str2 in the first 5 characters.\n");} else {printf("str1 is greater than str2 in the first 5 characters.\n");}    return 0;
}

4. 字符串查找

strstr

原型:char *strstr(const char *haystack, const char *needle);

原理:strstr()haystack 的开头开始,逐字符检查是否存在 needle。一旦找到匹配的 needle,它就会返回指向 needlehaystack 中第一次出现的位置的指针。如果找到 needle,返回指向它的指针;如果未找到,则返回 NULL

#include <stdio.h>
#include <string.h>
int main() {char str[] = "Hello, World!";char *result = strstr(str, "World");if (result) {printf("Found: %s\n", result);} else {printf("Not found.\n");}return 0;
}

strtok

原型 :char *strtok(char *str, const char *delim);

原理: 传入字符串 strstrtok() 会扫描字符串,找到并返回第一个标记的指针。传入 NULL 作为 str 参数,strtok() 会继续从上一次停止的位置分割并返回下一个标记的指针。返回指向每个标记的指针,最后一次调用时返回 NULL

#include <stdio.h>
#include <string.h>
int main() {char str[] = "Hello, World! Let's tokenize this.";char *token = strtok(str, " ,.!");//使用指针获取每个被截取到的字符串while (token != NULL) {printf("Token: %s\n", token);token = strtok(NULL, " ,.!");  // 继续分割传入NULL即可}return 0;
}

5. 错误信息报告

strerror

原型:char *strerror(int errnum);

原理:传入错误代码 errnumstrerror() 会返回对应的错误消息字符串。 返回指向静态错误消息字符串的指针。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main() {FILE *file = fopen("non_existent_file.txt", "r");if (file == NULL) {printf("Error opening file: %s\n", strerror(errno));}return 0;
}

  • 这是本人的学习笔记不是获利的工具,小作者会一直写下去,希望大家能多多监督
  • 文章会每攒够两篇进行更新发布(受平台原因,也是希望能让更多的人看见)
  • 感谢各位的阅读希望我的文章会对诸君有所帮助

http://www.mrgr.cn/news/4560.html

相关文章:

  • 【教程】Ubuntu给pycharm添加侧边栏快捷方式
  • Appium定位元素
  • 【论文阅读】DaST: Data-free Substitute Training for Adversarial Attacks(2020)
  • 优思学院|如何在30分钟内评审一家供应商?SQE必需知道的11点
  • 【Docker系列】Docker 容器时区设置指南
  • 纯前端导出excel插件pikaz-excel-js使用小结
  • 小程序学习day09-WXS脚本、自定义组件-组件的创建、引用、组件与页面的区别、组件的样式隔离
  • linux下搭建MySQL8.0.25一主一从
  • 【Vitis开发】下载程序时Memory write error at 0x0,Cotex-A53 #0:EDITR not ready问题的解决
  • Android 架构模式之 MVC
  • Vue: v-html安全性问题
  • Go语言基础--嵌套循环(多重循环)
  • 论文翻译:Universal and Transferable Adversarial Attacks on Aligned Language Models
  • [数据集][目标检测]街灯路灯检测数据集VOC+YOLO格式1893张1类别
  • LCP9回文数[leetcode-9-easy]
  • vue面试题十七
  • 【原创】java+swing+mysql学生请假管理系统设计与实现
  • 小米便签——ui包详细解读
  • Unity3D URP 后处理如何作用于 UI 控件 Image 的详解
  • 大型语言模型(LLM)——直接偏好优化完整指南