【C语言】字符串操作总结

目录

前言

1.字符串逆序输出

(1)不改变输入的字符串

(2)改变输入的字符串

2.求字符串长度的函数strlen

3.字符串拷贝函数strcpy

4.字符串连接函数strcat

5.字符串比较函数strcmp

[6.strncpy(p, p1, n) 复制指定长度字符串](#6.strncpy(p, p1, n) 复制指定长度字符串)

[7.strncat(p, p1, n) 附加指定长度字符串](#7.strncat(p, p1, n) 附加指定长度字符串)

8.strcasecmp忽略大小写比较字符串

[9.strncmp(p, p1, n) 比较指定长度字符串](#9.strncmp(p, p1, n) 比较指定长度字符串)

[10.strchr(p, c) 在字符串中查找指定字符](#10.strchr(p, c) 在字符串中查找指定字符)

[11.strstr(p, p1) 查找字符串](#11.strstr(p, p1) 查找字符串)

[12.isalpha() 检查是否为字母字符](#12.isalpha() 检查是否为字母字符)

[13.isupper() 检查是否为大写字母字符](#13.isupper() 检查是否为大写字母字符)

[14.islower() 检查是否为小写字母字符](#14.islower() 检查是否为小写字母字符)

[15.isdigit() 检查是否为数字](#15.isdigit() 检查是否为数字)


前言

总结了常用字符串函数操作和C语言字符串函数的实现


1.字符串逆序输出

(1)不改变输入的字符串

#include <stdio.h>
#include <string.h>

#define N 20

int main(int argc, char *argv[])
{
        char arr[N]; // 使用N初始化数组大小
        int i, n;

        printf("Please input a string:");
        fgets(arr, sizeof(arr), stdin); // 更安全的方式获取输入,使用fgets()函数

        n = strlen(arr); 
        for (i = n-1; i >= 0; i--)
                putchar(arr[i]);
        putchar('\n');

        return 0;
}

(2)改变输入的字符串

#include <stdio.h>
#include <string.h>

#define N 20

int main(int argc, char *argv[])
{
        char arr[N] = {0};
        int i, j, n, ch;

        printf("Please input a string:");
        fgets(arr, sizeof(arr), stdin); // 使用fgets安全地获取输入,指定最大读取字符数为数组大小

        n = strlen(arr);
        i = 0;
        j = n-1;
        while (i < j) 
        {
                ch = arr[i];
                arr[i] = arr[j];
                arr[j] = ch;
                i++;
                j--;
        }

        fputs(arr, stdout); // 使用fputs输出字符串,不会自动添加换行符

        return 0;
}

2.求字符串长度的函数strlen

size_t strlen(const char *str);
参数 str 是要计算长度的字符串,返回值是该字符串的长度。

格式:strlen(字符数组)

功能:计算字符串长度

返值:返回字符串实际长度,不包括'\0'在内

\xhh表示十六进制数代表的符号

\ddd表示8进制的

例:对于以下字符串,strlen(s)的值为:

char s[10]={'A','\0','B','C','\0','D'};

char s[ ]="\t\v\\\0will\n";

char s[ ]="\x69\141\n"; 答案:1 3 3

函数实现思路:

#include <stddef.h> // 为了使用 size_t 类型

size_t strlen(const char *str) 
{
    size_t length = 0; // 初始化字符串长度为 0

    // 循环直到遇到字符串的结尾
    while (*str != '\0') 
    {
        length++; // 每遍历一个字符,长度加一
        str++;    // 指针向后移动到下一个字符
    }

    return length; // 返回字符串长度
}

3.字符串拷贝函数strcpy

char *strcpy(char *dest, const char *src);

参数 dest 是目标字符串,src 是源字符串。该函数将 src 中的内容复制到 dest 中,并返回 dest

格式:strcpy(字符数组1,字符串2)

功能:将字符串2,拷贝到字符数组1中去

返值:返回字符数组1的首地址

说明: 字符数组1必须足够大 ,拷贝时'\0'一同拷贝

函数实现思路

char *strcpy(char *dest, const char *src) 
{
    char *p = dest; // 保存目标字符串的起始地址

    // 将源字符串的每个字符复制到目标字符串中,直到遇到源字符串的结尾
    while (*src != '\0')
    {
        *dest = *src; // 将源字符串的字符复制到目标字符串中
        dest++;       // 指针移动到下一个目标字符串的位置
        src++;        // 源字符串的指针也移动到下一个字符
    }

    *dest = '\0'; // 在目标字符串的末尾添加 null 字符 '\0'

    return p; // 返回目标字符串的起始地址
}

4.字符串连接函数strcat

char *strcat(char *dest, const char *src);

参数 dest 是目标字符串,src 是要连接的字符串。该函数将 src 中的内容连接到 dest 的末尾,并返回 dest

格式:strcat(字符数组1,字符数组2)

功能:把字符数组2连到字符数组1后面

返值:返回字符数组1的首地址

说明: 字符数组1必须足够大 以容纳原始字符串的内容和新的字符串内容

连接前,两串均以'\0'结束;

连接后,串1的'\0'取消,新串最后加'\0'

函数实现思路:

char *strcat(char *dest, const char *src) 
{
    char *p = dest; // 保存目标字符串的起始地址

    // 移动指针到目标字符串的结尾
    while (*dest != '\0') 
    {
        dest++;
    }

    // 将源字符串的内容复制到目标字符串的末尾
    while (*src != '\0') 
    {
        *dest = *src; // 将源字符串的字符复制到目标字符串的末尾
        dest++;       // 指针移动到下一个目标字符串的位置
        src++;        // 源字符串的指针也移动到下一个字符
    }

    *dest = '\0'; // 在目标字符串的末尾添加 null 字符 '\0'

    return p; // 返回目标字符串的起始地址
}

5.字符串比较函数strcmp

int strcmp(const char *str1, const char *str2);

参数 str1str2 是要比较的两个字符串。如果两个字符串相等,返回值为 0;如果 str1 按字典顺序小于 str2,则返回值小于 0;如果 str1 按字典顺序大于 str2,则返回值大于 0。

格 式:strcmp(字符串1,字符串2)

功 能:比较两个字符串 比较规则:对两串从左向右逐个字符比较

(ASCII码),直到遇到不同字符或'\0'为止

返 值:返回int型整数

a. 若字符串1< 字符串2, 返回负整数

b. 若字符串1> 字符串2, 返回正整数

c. 若字符串1== 字符串2, 返回零

函数实现:

int strcmp(const char *str1, const char *str2) 
{
    while (*str1 != '\0' && *str2 != '\0' && *str1 == *str2) 
    {
        str1++;
        str2++;
    }
    return (*str1 - *str2); // 返回字符串比较结果
}

6.strncpy(p, p1, n) 复制指定长度字符串

strncpy 函数用于将源字符串的指定长度复制到目标字符串中。如果源字符串的长度小于指定长度,则在复制完源字符串后,目标字符串的剩余空间将用空字符填充。

char *strncpy(char *dest, const char *src, size_t n);

参数 dest 是目标字符串,src 是源字符串,n 是要复制的字符数。

函数实现:

#include <stddef.h> // 为了使用 size_t 类型

// 将源字符串的内容复制到目标字符串,最多复制 n 个字符
char *strncpy(char *dest, const char *src, size_t n) 
{
    char *p = dest; // 保存目标字符串的起始地址

    // 拷贝源字符串的内容到目标字符串,直到达到指定的字符数或者遇到源字符串的结尾
    while (n > 0 && *src != '\0') 
    {
        *dest++ = *src++; // 将源字符串的字符复制到目标字符串中
        n--;
    }

    //如果源字符串的长度小于指定长度,则在复制完源字符串后,目标字符串的剩余空间将用空字符填充。 
    while (n > 0) 
    {
        *dest++ = '\0'; 
    }

    return p; // 返回目标字符串的起始地址
}

7.strncat(p, p1, n) 附加指定长度字符串

strncat 函数用于将源字符串的指定长度附加到目标字符串的末尾。

char *strncat(char *dest, const char *src, size_t n);

参数 dest 是目标字符串,src 是源字符串,n 是要附加的字符数。

函数实现:

char *strncat(char *dest, const char *src, size_t n) 
{
    char *p = dest; // 保存目标字符串的起始地址

    // 移动指针到目标字符串的结尾
    while (*dest != '\0') 
    {
        dest++;
    }

    // 将源字符串的内容复制到目标字符串的末尾,最多复制 n 个字符
    while (n > 0 && *src != '\0') 
    {
        *dest++ = *src++; // 将源字符串的字符复制到目标字符串的末尾
        n--;
    }

    *dest = '\0'; // 在目标字符串的末尾添加 null 字符 '\0'

    return p; // 返回目标字符串的起始地址
}

8.strcasecmp忽略大小写比较字符串

strcasecmp 函数用于比较两个字符串,忽略大小写。其原型为:

int strcasecmp(const char *str1, const char *str2);

参数 str1str2 是要比较的两个字符串。如果两个字符串相等(不区分大小写),返回值为 0;否则返回非 0 值。

函数实现:

#include <ctype.h> // 为了使用 tolower 函数

int strcasecmp(const char *str1, const char *str2) 
{
    while (*str1 != '\0' && *str2 != '\0' && tolower(*str1) == tolower(*str2)) 
    {
        str1++;
        str2++;
    }
    return (tolower(*str1) - tolower(*str2)); // 返回字符串比较结果
}

9.strncmp(p, p1, n) 比较指定长度字符串

strncmp 函数用于比较两个字符串的前n个字符。其原型为:

int strncmp(const char *str1, const char *str2, size_t n);

参数 str1str2 是要比较的两个字符串,n 是要比较的字符数。如果两个字符串的前n个字符相等,返回值为 0;否则返回非 0 值。

函数实现:

#include <stddef.h> // 为了使用 size_t 类型

int strncmp(const char *str1, const char *str2, size_t n) 
{
    while (n > 0 && *str1 != '\0' && *str2 != '\0' && *str1 == *str2) 
    {
        str1++;
        str2++;
        n--;
    }
    if (n == 0) 
    {
        return 0; // 前 n 个字符相等
    } 
    else 
    {
        return (*str1 - *str2); // 返回字符串比较结果
    }
}

10.strchr(p, c) 在字符串中查找指定字符

strchr 函数在字符串中查找指定字符,并返回第一个匹配到的字符的指针。其原型为:

char *strchr(const char *str, int c);

参数 str 是要搜索的字符串,c 是要查找的字符。如果找到了指定字符,则返回该字符在字符串中的地址;否则返回 NULL。

函数实现:

char *strchr(const char *str, int c) 
{
    while (*str != '\0') 
    {
        if (*str == c) 
        {
            return (char *)str; // 返回指定字符在字符串中的位置
        }
        str++;
    }
    return NULL; // 没有找到指定字符,返回 NULL
}

11.strstr(p, p1) 查找字符串

strstr 函数在字符串中查找指定子字符串,并返回第一个匹配到的子字符串的指针。其原型为:

char *strstr(const char *haystack, const char *needle);

参数 haystack 是要搜索的字符串,needle 是要查找的子字符串。如果找到了指定的子字符串,则返回该子字符串在字符串中的地址;否则返回 NULL。

函数实现:

char *strstr(const char *haystack, const char *needle) 
{
    while (*haystack != '\0') 
    {
        const char *h = haystack;
        const char *n = needle;

        // 在 haystack 中查找与 needle 第一个字符匹配的位置
        while (*h != '\0' && *n != '\0' && *h == *n) 
        {
            h++;
            n++;
        }

        // 如果找到了 needle,则返回其在 haystack 中的位置
        if (*n == '\0') 
        {
            return (char *)haystack;
        }

        // 否则,继续搜索下一个字符
        haystack++;
    }

    // 如果 haystack 中不存在 needle,则返回 NULL
    return NULL;
}

12.isalpha() 检查是否为字母字符

isalpha 函数用于检查一个字符是否为字母字符(即 A-Z 或 a-z)。其原型为:

int isalpha(int c);

如果 c 是一个字母字符,则返回非零值(即真);否则返回 0。

函数实现:

int isalpha(int c) 
{
    return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
}

13.isupper() 检查是否为大写字母字符

isupper 函数用于检查一个字符是否为大写字母字符(即 A-Z)。其原型为:

int isupper(int c);

如果 c 是一个大写字母字符,则返回非零值(即真);否则返回 0。

函数实现:

int isupper(int c) 
{
    return (c >= 'A' && c <= 'Z');
}

14.islower() 检查是否为小写字母字符

islower 函数用于检查一个字符是否为小写字母字符(即 a-z)。其原型为:

int islower(int c);

如果 c 是一个小写字母字符,则返回非零值(即真);否则返回 0。

函数实现:

int islower(int c) 
{
    return (c >= 'a' && c <= 'z');
}

15.isdigit() 检查是否为数字

isdigit 函数用于检查一个字符是否为数字字符(即 0-9)。其原型为:

int isdigit(int c);

如果 c 是一个数字字符,则返回非零值(即真);否则返回 0。

函数实现:

int isdigit(int c) 
{
    return (c >= '0' && c <= '9');
}
相关推荐
Ezekiel Mok6 分钟前
基于路径长度的样条插补算法(自动驾驶和路径跟踪控制适用)
算法·matlab·自动驾驶·路径跟踪·插补
小小怪下士的编程小屋13 分钟前
stm32中断
c语言·stm32·单片机·嵌入式硬件
不死鸟.亚历山大.狼崽子13 分钟前
python库(2):Passlib库
开发语言·python
jllws116 分钟前
C++基础:STL概述
开发语言·c++
FightingLod19 分钟前
C++中list容器使用详解
开发语言·c++·list
Zucker n29 分钟前
学会python——用python制作一个登录和注册窗口(python实例十八)
开发语言·python
mana飞侠29 分钟前
代码随想录算法训练营第59天:动态[1]
开发语言·数据结构·算法·动态规划
艾恩小灰灰31 分钟前
为何Web前端开发仍坚守 HTML 和 CSS,而不全然拥抱纯 JavaScript?
开发语言·前端·javascript·css·html·纯js
zengy533 分钟前
代码随想录打卡第十三天
数据结构·c++·算法·leetcode
瑶风41 分钟前
go语言并发编程2-runtime
开发语言·golang·xcode