字符串函数———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;
}
  • 这是本人的学习笔记不是获利的工具,小作者会一直写下去,希望大家能多多监督我
  • 文章会每攒够两篇进行更新发布(受平台原因,也是希望能让更多的人看见)
  • 感谢各位的阅读希望我的文章会对诸君有所帮助
相关推荐
云卓SKYDROID5 分钟前
除草机器人算法以及技术详解!
算法·机器人·科普·高科技·云卓科技·算法技术
Source.Liu11 分钟前
【用Rust写CAD】第二章 第四节 函数
开发语言·rust
monkey_meng11 分钟前
【Rust中的迭代器】
开发语言·后端·rust
余衫马14 分钟前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng17 分钟前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
Jacob程序员20 分钟前
java导出word文件(手绘)
java·开发语言·word
懒大王就是我25 分钟前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
小白学大数据26 分钟前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin
VBA633728 分钟前
VBA之Word应用第三章第三节:打开文档,并将文档分配给变量
开发语言
半盏茶香28 分钟前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏