在C语言中,字符串是以空字符('\0')结尾的字符数组。C语言没有专门的字符串类型,而是使用字符数组来表示字符串。标准库<string.h>提供了丰富的字符串处理函数。

字符串数组

strlen

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

int main() {
    char str[] = "Hello, World!";
    printf("字符串长度: %zu\n", strlen(str));  // 输出:字符串长度: 13
    return 0;
}

strcpy

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

int main() {
    char src[] = "Hello";
    char dest[10];
    strcpy(dest, src);
    printf("复制后的字符串: %s\n", dest);  // 输出:复制后的字符串: Hello
    return 0;
}
  • 将源字符串复制到目标字符串

  • 返回值:目标字符串的指针

  • 注意:确保目标字符串有足够空间,否则会导致缓冲区溢出

strncpy

  • 复制指定长度的字符串

  • 返回值:目标字符串的指针

  • 注意:如果源字符串长度小于n,则用'\0'填充目标字符串;如果源字符串长度大于等于n,则不会自动添加'\0'

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char src[] = "Hello, World!";
        char dest[10];
        strncpy(dest, src, 5);
        dest[5] = '\0';  // 手动添加结束符
        printf("复制后的字符串: %s\n", dest);  // 输出:复制后的字符串: Hello
        return 0;
    }

    字符串连接函数

    strcat

  • 将源字符串连接到目标字符串末尾

  • 返回值:目标字符串的指针

  • 注意:确保目标字符串有足够空间

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char dest[20] = "Hello, ";
        char src[] = "World!";
        strcat(dest, src);
        printf("连接后的字符串: %s\n", dest);  // 输出:连接后的字符串: Hello, World!
        return 0;
    }

    strncat

    将源字符串的前n个字符连接到目标字符串末尾,自动添加'\0'结束符

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char dest[20] = "Hello, ";
        char src[] = "World!";
        strncat(dest, src, 3);
        printf("连接后的字符串: %s\n", dest);  // 输出:连接后的字符串: Hello, Wor
        return 0;
    }

    strcmp

  • 如果str1 < str2,返回负值

  • 如果str1 == str2,返回0

  • 如果str1 > str2,返回正值

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char str1[] = "apple";
        char str2[] = "banana";
        
        int result = strcmp(str1, str2);
        if (result < 0) {
            printf("str1 小于 str2\n");
        } else if (result > 0) {
            printf("str1 大于 str2\n");
        } else {
            printf("str1 等于 str2\n");
        }
        
        return 0;
    }

    strncmp

  • 比较两个字符串的前n个字符

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char str1[] = "apple";
        char str2[] = "application";
        
        int result = strncmp(str1, str2, 3);
        if (result == 0) {
            printf("前3个字符相同\n");  // 输出:前3个字符相同
        } else {
            printf("前3个字符不同\n");
        }
        
        return 0;
    }

    字符串查找函数

  • strchr

  • 在字符串中查找第一次出现指定字符的位置

  • 返回值:指向第一次出现该字符的指针,如果未找到则返回NULL

  • #include <stdio.h>
    #include <string.h>
    
    int main() {
        char str[] = "Hello, World!";
        char *p = strchr(str, 'o');
        
        if (p != NULL) {
            printf("字符'o'在字符串中的位置: %ld\n", p - str);  // 输出:字符'o'在字符串中的位置: 4
            printf("从该位置开始的子串: %s\n", p);  // 输出:从该位置开始的子串: o, World!
        } else {
            printf("未找到字符'o'\n");
        }
        
        return 0;
    }

    strrchr

  • 在字符串中查找最后一次出现指定字符的位置

  • 返回值:指向最后一次出现该字符的指针,如果未找到则返回NULL

  • #include <stdio.h>
    #include <string.h>
    
    int main() {
        char str[] = "Hello, World!";
        char *p = strrchr(str, 'o');
        
        if (p != NULL) {
            printf("字符'o'最后出现的位置: %ld\n", p - str);  // 输出:字符'o'最后出现的位置: 8
        }
        
        return 0;
    }

    strstr

  • 在字符串中查找子串第一次出现的位置

  • 返回值:指向子串第一次出现的指针,如果未找到则返回NULL

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

int main() {
    char haystack[] = "Hello, World!";
    char needle[] = "World";
    
    char *p = strstr(haystack, needle);
    
    if (p != NULL) {
        printf("子串在原字符串中的位置: %ld\n", p - haystack);  // 输出:子串在原字符串中的位置: 7
        printf("找到的子串及其后面的内容: %s\n", p);  // 输出:找到的子串及其后面的内容: World!
    } else {
        printf("未找到子串\n");
    }
    
    return 0;
}

字符串转换数字函数

atoi, atof, atol

  • 将字符串转换为整数、浮点数或长整数

  • 返回值:转换后的数值

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        char str1[] = "123";
        char str2[] = "3.14159";
        char str3[] = "10000000";
        
        int i = atoi(str1);
        double f = atof(str2);
        long l = atol(str3);
        
        printf("整数: %d\n", i);      // 输出:整数: 123
        printf("浮点数: %f\n", f);    // 输出:浮点数: 3.141590
        printf("长整数: %ld\n", l);   // 输出:长整数: 10000000
        
        return 0;
    }

    strtol, strtod, strtoul

  • 更安全的字符串转换函数,可以指定进制,并可以获取转换结束的位置

  • #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        char str[] = "1234.56abc";
        char *endptr;
        
        long l = strtol(str, &endptr, 10);
        printf("转换的整数: %ld\n", l);           // 输出:转换的整数: 1234
        printf("转换结束的位置: %s\n", endptr);   // 输出:转换结束的位置: .56abc
        
        double d = strtod(str, &endptr);
        printf("转换的浮点数: %f\n", d);          // 输出:转换的浮点数: 1234.560000
        printf("转换结束的位置: %s\n", endptr);   // 输出:转换结束的位置: abc
        
        return 0;
    }

    内存操作函数

memcpy

  • 复制指定字节数的内存内容

  • 返回值:目标内存的指针

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char src[] = "Hello, World!";
        char dest[20];
        
        memcpy(dest, src, strlen(src) + 1);  // +1 是为了复制结束符'\0'
        printf("复制后的字符串: %s\n", dest);  // 输出:复制后的字符串: Hello, World!
        
        return 0;
    }

    memmove

  • 类似memcpy,但可以处理源和目标内存重叠的情况

  • 返回值:目标内存的指针

  • #include <stdio.h>
    #include <string.h>
    
    int main() {
        char str[] = "Hello, World!";
        
        // 将"Hello, "后面的内容移到前面,覆盖"Hello, "
        memmove(str, str + 7, strlen(str) - 6);
        printf("移动后的字符串: %s\n", str);  // 输出:移动后的字符串: World!
        
        return 0;
    }

    memset

    将指定内存区域填充为指定的值

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

int main() {
    char str[20] = "Hello, World!";
    
    // 将前5个字符设置为'*'
    memset(str, '*', 5);
    printf("设置后的字符串: %s\n", str);  // 输出:设置后的字符串: *****, World!
    
    return 0;
}

memcmp

  • 比较两个内存区域的前n个字节

  • 返回值:与strcmp类似

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char str1[] = "Hello";
        char str2[] = "Helpo";
        
        int result = memcmp(str1, str2, 3);
        if (result == 0) {
            printf("前3个字节相同\n");  // 输出:前3个字节相同
        } else {
            printf("前3个字节不同\n");
        }
        
        result = memcmp(str1, str2, 5);
        if (result == 0) {
            printf("前5个字节相同\n");
        } else {
            printf("前5个字节不同\n");  // 输出:前5个字节不同
        }
        
        return 0;
    }

    字符串分割函数

    strtok

  • 将字符串分割成一系列标记(tokens)

  • 返回值:指向当前标记的指针,如果没有更多标记则返回NULL

  • 注意:strtok会修改原字符串,将分隔符替换为'\0'

  • #include <stdio.h>
    #include <string.h>
    
    int main() {
        char str[] = "Hello,World,C,Programming";
        char *token;
        
        // 获取第一个标记
        token = strtok(str, ",");
        
        // 继续获取剩余的标记
        while (token != NULL) {
            printf("标记: %s\n", token);
            token = strtok(NULL, ",");
        }
        
        return 0;
    }

    安全字符函数

  • strcpy_s, strcat_s, strncpy_s, strncat_s

  • 安全版本的字符串复制和连接函数

  • 返回值:成功返回0,失败返回非零错误码

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char dest[10];
        
        // 安全复制,指定目标缓冲区大小
        if (strcpy_s(dest, sizeof(dest), "Hello") == 0) {
            printf("复制成功: %s\n", dest);
        } else {
            printf("复制失败\n");
        }
        
        // 安全连接,指定目标缓冲区大小
        if (strcat_s(dest, sizeof(dest), ", World") == 0) {
            printf("连接成功: %s\n", dest);
        } else {
            printf("连接失败,可能是缓冲区太小\n");
        }
        
        return 0;
    }

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐