字符串函数———C语言

1. 求字符串的长度

strlen

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

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

cpp 复制代码
#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不可变化,必须在复制操作前预先分配足够的内存空间。如果目标空间的大小不足以容纳源字符串,则可能导致缓冲区溢出等严重错误。

cpp 复制代码
#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 的剩余空间是否足够,可能会导致缓冲区溢出和潜在的程序崩溃。

cpp 复制代码
#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的数字
cpp 复制代码
#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));//返回结果是0
    return 0;
}

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

1.strncpy

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

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

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

2.strncat

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

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

cpp 复制代码
#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);
    // hellowor
    return 0;
}

3.strncmp

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

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

cpp 复制代码
#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

cpp 复制代码
#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

cpp 复制代码
#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() 会返回对应的错误消息字符串。返回指向静态错误消息字符串的指针。

cpp 复制代码
#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;
}
  • 这是本人的学习笔记不是获利的工具,小作者会一直写下去,希望大家能多多监督我
  • 文章会每攒够两篇进行更新发布(受平台原因,也是希望能让更多的人看见)
  • 感谢各位的阅读希望我的文章会对诸君有所帮助
相关推荐
卢锡荣6 小时前
单芯掌控多口互联|乐得瑞 LDR6020 PD3.1 多通道 Type‑C 控制 SOC 芯片
c语言·开发语言
2333!!!!!6 小时前
rocket新手一些常见问题
java·开发语言
yume_sibai6 小时前
02-Rust 所有权与借用深入解析(底层原理 + 借用检查器 + 生命周期 + 内部可变性)
开发语言·后端·rust
residual_fan6 小时前
特征级SMOTE(Feature-level SMOTE)论文分享
人工智能·算法·数据挖掘·数据分析
xxwxx__6 小时前
深入理解 C++ STL:stack、queue 与 deque 从使用到底层实现全解析
开发语言·c++·算法
Highcharts.js6 小时前
甘特图纵向任务、横向时间显示图表可视化开发|Highcharts甘特图示例
开发语言·前端·javascript·可视化·甘特图·数据可视化·highcharts
wuminyu6 小时前
JVM锁膨胀与Futex源码解析
java·linux·c语言·jvm·c++
郝学胜-神的一滴6 小时前
C++11 工程级应用 08:Lambda表达式与Tuple元组
开发语言·jvm·c++·python·程序人生·开源
sylviiiiiia6 小时前
Leetcode hot100 多数元素/相交链表/反转链表
算法·leetcode·链表
CoderYanger6 小时前
A.每日一题:3622. 判断整除性
java·程序人生·算法·leetcode·面试·职场和发展·蓝桥杯