2-2 字符串的基本操作函数及注意事项(超详细)

目录

字符串操作函数分类

1. 字符串长度和复制

2. 字符串连接

3. 字符串比较

4. 字符串查找

5. 字符串转换

6. 字符串复制和移动

7. 字符串填充和比较

字符串操作函数使用

1. strlen 函数

2. strcpy 函数

3. strcat 函数

4. strcmp 函数

5. strncpy 函数

6. strncat 函数

7. strncmp 函数

8. strchr 函数

9. strrchr 函数

10. strstr 函数


在编程中,字符串操作是非常常见的任务,特别是在处理文本数据时。以下是一些常用的字符串操作函数,主要是 C 标准库中的函数:

字符串操作函数分类

1. 字符串长度和复制

  1. strlen: 计算字符串的长度。

    size_t strlen(const char *str);

  2. strcpy: 复制字符串。

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

  3. strncpy: 复制指定长度的字符串。

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

2. 字符串连接

  1. strcat: 连接字符串。

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

  2. strncat: 连接指定长度的字符串。

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

3. 字符串比较

  1. strcmp: 比较字符串。

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

  2. strncmp: 比较指定长度的字符串。

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

4. 字符串查找

  1. strchr: 查找字符在字符串中首次出现的位置。

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

  2. strrchr: 查找字符在字符串中最后一次出现的位置。

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

  3. strstr: 查找子字符串在字符串中首次出现的位置。

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

5. 字符串转换

  1. atoi: 将字符串转换为整数。

    int atoi(const char *str);

  2. atol: 将字符串转换为长整数。

    long int atol(const char *str);

  3. atof: 将字符串转换为浮点数。

    double atof(const char *str);

  4. strtol: 将字符串转换为长整数,具有错误处理。

    long int strtol(const char *str, char **endptr, int base);

  5. strtoul: 将字符串转换为无符号长整数,具有错误处理。

    unsigned long int strtoul(const char *str, char **endptr, int base);

  6. strtod: 将字符串转换为双精度浮点数,具有错误处理。

    double strtod(const char *str, char **endptr);

6. 字符串复制和移动

  1. memcpy: 复制内存块。

    void *memcpy(void *dest, const void *src, size_t n);
    
  2. memmove: 移动内存块。

    void *memmove(void *dest, const void *src, size_t n);

7. 字符串填充和比较

  1. memset: 填充内存块。

    void *memset(void *s, int c, size_t n);

  2. memcmp: 比较内存块。

    int memcmp(const void *s1, const void *s2, size_t n);

字符串操作函数使用

1. strlen 函数

功能: 计算字符串的长度(不包括末尾的空字符'\0')。

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

使用示例:

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

int main() {
    char str[] = "Hello, world!";
    size_t len = strlen(str);
    printf("Length of the string is: %zu\n", len);
    return 0;
}

注意事项:

  • 确保字符串是以空字符 '\0' 结尾的。如果字符串没有正确地终止,strlen 可能会继续读取内存中的数据,直到遇到一个空字符,导致未定义行为。
  • 使用 strlen 的结果时注意防止越界访问。

2. strcpy 函数

功能: 将源字符串复制到目标字符串中(包括末尾的空字符'\0')。

原型: char *strcpy(char *dest, const char *src);

使用示例:

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

int main() {
    char src[] = "Hello, world!";
    char dest[50]; // 确保目标数组足够大以容纳源字符串
    strcpy(dest, src);
    printf("Copied string is: %s\n", dest);
    return 0;
}

注意事项:

  • 目标字符串 dest 必须有足够的空间来容纳源字符串 src,包括终止的空字符 '\0'。如果 dest 空间不足,会导致缓冲区溢出,可能引发安全漏洞。
  • 推荐使用更安全的 strncpy 函数,指定最大复制字符数。

3. strcat 函数

功能: 将源字符串追加到目标字符串的末尾(目标字符串必须有足够的空间容纳新字符串)。

原型: char *strcat(char *dest, const char *src);

使用示例:

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

int main() {
    char dest[50] = "Hello, ";
    char src[] = "world!";
    strcat(dest, src);
    printf("Concatenated string is: %s\n", dest);
    return 0;
}

注意事项:

  • 目标字符串 dest 必须有足够的空间来容纳原有的内容和源字符串 src 以及终止的空字符 '\0'。如果 dest 空间不足,会导致缓冲区溢出。
  • 推荐使用更安全的 strncat 函数,指定最大追加字符数。

4. strcmp 函数

功能: 比较两个字符串的大小。

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

返回值:

  • 如果str1等于str2,返回0
  • 如果str1小于str2,返回负值。
  • 如果str1大于str2,返回正值。

使用示例:

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

int main() {
    char str1[] = "Hello";
    char str2[] = "World";
    int result = strcmp(str1, str2);
    if (result == 0) {
        printf("The strings are equal.\n");
    } else if (result < 0) {
        printf("The first string is less than the second string.\n");
    } else {
        printf("The first string is greater than the second string.\n");
    }
    return 0;
}

注意事项:

  • strcmp 返回一个整数,根据返回值判断字符串的大小关系。
  • strcmp 比较时区分大小写。如果需要不区分大小写的比较,可以使用 strcasecmpstricmp 函数(具体函数名称根据系统有所不同)。

5. strncpy 函数

功能: 将指定长度的字符从源字符串复制到目标字符串。

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

使用示例:

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

int main() {
    char src[] = "Hello, world!";
    char dest[50];
    strncpy(dest, src, 5); // 只复制前5个字符
    dest[5] = '\0'; // 手动添加终止符
    printf("Copied string is: %s\n", dest);
    return 0;
}

注意事项:

  • strncpy 不一定会在目标字符串末尾添加终止的空字符 '\0',如果源字符串长度大于或等于指定长度 n,需要手动添加 '\0'
  • 使用时要确保目标字符串有足够的空间存放指定长度的字符及可能的终止符。

6. strncat 函数

功能: 将指定长度的字符从源字符串追加到目标字符串的末尾。

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

使用示例:

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

int main() {
    char dest[50] = "Hello, ";
    char src[] = "world!";
    strncat(dest, src, 3); // 只追加前3个字符
    printf("Concatenated string is: %s\n", dest);
    return 0;
}

注意事项:

  • strncat 追加的字符数不包括终止的空字符 '\0',但会自动在末尾添加一个空字符。因此,目标字符串需要有足够的空间。
  • 使用时要注意源字符串和追加的字符数,以及目标字符串的剩余空间。

7. strncmp 函数

功能: 比较两个字符串的前n个字符。

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

使用示例:

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

int main() {
    char str1[] = "Hello";
    char str2[] = "Helium";
    int result = strncmp(str1, str2, 3); // 比较前3个字符
    if (result == 0) {
        printf("The first 3 characters of the strings are equal.\n");
    } else if (result < 0) {
        printf("The first 3 characters of the first string are less than the second string.\n");
    } else {
        printf("The first 3 characters of the first string are greater than the second string.\n");
    }
    return 0;
}

注意事项:

  • strncmp 只比较指定长度的字符,如果两个字符串在指定长度内相同,返回 0,否则返回正值或负值。
  • 使用时要确保比较的长度不会超出字符串实际长度。

8. strchr 函数

功能: 查找字符串中首次出现的字符。

原型: char *strchr(const char *str, int c);

使用示例:

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

int main() {
    char str[] = "Hello, world!";
    char *ptr = strchr(str, 'o');
    if (ptr) {
        printf("First occurrence of 'o' is at position: %ld\n", ptr - str);
    } else {
        printf("'o' not found in the string.\n");
    }
    return 0;
}

注意事项:

  • strchr 查找的字符在字符串中首次出现的位置,如果未找到则返回 NULL
  • 使用返回的指针时要检查是否为 NULL,以避免访问非法内存。

9. strrchr 函数

功能: 查找字符串中最后一次出现的字符。

原型: char *strrchr(const char *str, int c);

使用示例:

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

int main() {
    char str[] = "Hello, world!";
    char *ptr = strrchr(str, 'o');
    if (ptr) {
        printf("Last occurrence of 'o' is at position: %ld\n", ptr - str);
    } else {
        printf("'o' not found in the string.\n");
    }
    return 0;
}

注意事项:

  • strrchr 查找的字符在字符串中最后一次出现的位置,如果未找到则返回 NULL
  • 使用返回的指针时要检查是否为 NULL,以避免访问非法内存。

10. strstr 函数

功能: 查找子字符串在字符串中首次出现的位置。

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

使用示例:

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

int main() {
    char haystack[] = "Hello, world!";
    char needle[] = "world";
    char *ptr = strstr(haystack, needle);
    if (ptr) {
        printf("Substring found at position: %ld\n", ptr - haystack);
    } else {
        printf("Substring not found.\n");
    }
    return 0;
}

注意事项:

  • strstr 查找子字符串在字符串中首次出现的位置,如果未找到则返回 NULL
  • 使用返回的指针时要检查是否为 NULL,以避免访问非法内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值