C语言 字符串操作函数

简介: 本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。

字符串操作函数

1.strlen()函数

strlen()函数用于计算字符串的长度,返回字符串的字符数。

语法:

size_t strlen(const char *str)

参数:

  • str -- 要计算长度的字符串。

返回值:

  • 字符串的字符数。

示例:

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

int main ()
{
   
   char str[50]="hello world";
   len = strlen(str);
   printf("|%s| 的长度是 |%d|\n", str, len);
   return 0;
}

让我们编译并运行上面的程序,这将产生以下结果:

|hello world| 的长度是 |11|

长度为11,因为它包含了11个字符。

自实现

int myStrlen(const char * str)
{
   
    int len = 0;
    while(*str++)
    len++;
    return len;
}

2.strcpy()函数

strcpy()函数用于复制一个字符串到另一个字符串。

语法:

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

参数:

  • dest -- 目标字符串。
  • src -- 源字符串。

返回值:

  • 目标字符串。

示例:

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

int main ()
{
     char str1[50];
   char str2[50]="hello";
   strcpy(str1, str2);
   printf("|%s| 复制到 |%s|\n", str1, str2);
   return 0;
}

输出:

|hello| 复制到 |hello|

自实现

char *myStrcpy(char *dst, const char * src)
{
   
    char *d = dst;
    while(*dst++ = *src++);
    return d;
}

3.strncpy()函数

函数 char strncpy(char dest, const char *src, size_t n)
把 src 所指向的字符串复制到 dest,最多复制 n 个字符。
当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。

语法:

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

参数:

  • dest -- 目标字符串。
  • src -- 源字符串。
  • n -- 要复制的字符数。

返回值:

  • 目标字符串。
  • 如果 n 为 0,则返回 NULL。

示例:

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

int main ()
{
     char str1[50];
   char str2[50]="hello world";
   strncpy(str1, str2, 5);
   printf("|%s| --- |%s|\n", str1, str2);
   return 0;
}

输出:

|hello| --- |hello world|

自实现

char *myStrncpy(char *dst, const char *src, int n)
{
   
    char *d = dst;
    while(n-- && (*dst++ = *src++));
    while(n-- > 0)
        *dst++ = '\0';
    return d;
}

4.strcat()函数

函数 char strcat(char dest, const char *src)
把 src 所指向的字符串追加到 dest 后面。

语法:

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

参数:

  • dest -- 目标字符串。
  • src -- 源字符串。

返回值:

  • 目标字符串。

示例:

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

int main ()
{
     char str1[50]="hello ";
   char str2[50]="world";
   strcat(str1, str2);
   printf("|%s|\n", str1);
   return 0;
}

输出:

|hello world|

自实现

char *myStrcat(char *dst, const char *src)
{
   
    char *d = dst;
    while(*d)
        d++;
    while((*d++ = *src++));
    return dst;
}

5.strncat()函数

函数 char strncat(char dest, const char *src, size_t n)
把 src 所指向的字符串追加到 dest 后面,最多追加 n 个字符。

语法:

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

参数:

  • dest -- 目标字符串。
  • src -- 源字符串。
  • n -- 要追加的字符数。

返回值:

  • 目标字符串。

示例:

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

int main ()
{
     char str1[50]="hello ";
   char str2[50]="world";
   strncat(str1, str2, 5);
   printf("|%s|\n", str1);
   return 0;
}

输出:

|hello world|

自实现

char *myStrcat(char *dst, const char *src)
{
   
    char * d = dst;
    while(*dst) dst++;
    while(*dst++ = *src++);
    return d;
}

6.strcmp()函数

函数 int strcmp(const char str1, const char str2)
比较两个字符串的大小。

语法:

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

参数:

  • str1 -- 字符串1。
  • str2 -- 字符串2。
  • 返回值:
  • 如果 str1 等于 str2,则返回 0。
  • 如果 str1 小于 str2,则返回小于 0 的值。
  • 如果 str1 大于 str2,则返回大于 0 的值。

示例:

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


int main ()
{
     char str1[50]="hello";
   char str2[50]="world";
   int result;

   result = strcmp(str1, str2);
   if (result < 0)
      printf("|%s| 小于 |%s|\n", str1, str2);
   else if (result > 0)
      printf("|%s| 大于 |%s|\n", str1, str2);
   else
      printf("|%s| 等于 |%s|\n", str1, str2);


   return 0;


}

输出:

|hello| 小于 |world|

自实现

int myStrcmp(const char * s1, const char * s2)
{
   
    for(;*s1 && *s2; s1++,s2++) {
   
        if(*s1 == *s2)
            continue;
        else
        return *s1 -*s2;
    }
    return *s1 -*s2;
}

7.strncmp()函数

函数 int strncmp(const char str1, const char str2, size_t n)
比较两个字符串的前 n 个字符的大小。

语法:

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

参数:

  • str1 -- 字符串1。
  • str2 -- 字符串2。
  • n -- 要比较的字符数。
  • 返回值:
  • 如果 str1 等于 str2,则返回 0。
  • 如果 str1 小于 str2,则返回小于 0 的值。
  • 如果 str1 大于 str2,则返回大于 0 的值。

示例:

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


int main ()
{
     char str1[50]="hello";
   char str2[50]="world";
   int result;

   result = strncmp(str1, str2, 4);
   if (result < 0)
      printf("|%s| 小于 |%s|\n", str1, str2);
   else if (result > 0)
      printf("|%s| 大于 |%s|\n", str1, str2);
   else
      printf("|%s| 等于 |%s|\n", str1, str2);


   return 0;


}

输出:

|hello| 小于 |world|

自实现

int myStrncmp(const char * s1, const char * s2, int n)
{
   
    for(;*s1 && *s2 && n; s1++,s2++,n--) {
   
        if(*s1 == *s2)
            continue;
        else
        return *s1 -*s2;
    }
   return 0;
}

8.sprintf()函数

函数 int sprintf(char str, const char format, ...)
把格式化的数据写入某个字符串缓冲区

语法:

int sprintf(char *str, const char *format, ...)

参数:

  • str -- 字符串缓冲区。
  • format -- 格式字符串。
  • ... -- 可变参数。

返回值:

  • 写入的字符数。

示例:

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


int main()
{
   
    int a,b,c,d;
    printf("pls input ip:");
    scanf("%d.%d.%d.%d",&a,&b,&c,&d);
    char buf[16];
    sprintf(buf,"%d.%d.%d.%d",a,b,c,d);
    printf("%s\n",buf);
    return 0;
}

输出:

pls input ip:124.13.3.5
124.13.3.5

自实现

不会

9.atoi()函数

函数 int atoi(const char *nptr)
将字符串转换成整型数;atoi()会扫描参数 nptr 字符串,跳过前面的空格字
符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符('\0')
时才结束转化,并将结果返回(返回转换后的整型数)。

语法:

int atoi(const char *nptr)

参数:

  • str -- 字符串。

返回值:

  • 转换后的整数。

示例:

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


int main()
{
   
    char str[100] = "12345";        

    int num = atoi(str);

    printf("The number is: %d\n", num);

    return 0;
}

输出:

The number is: 12345

自实现

不会

10.itoa()函数

函数 itoa
根据指定的进制(base),将整型数据转化为以'\0'结尾的字符串,保
存到 str 指向的字符数组中。

语法:

char * itoa ( int value, char * str, int base );(非标库函数)

参数:

  • value -- 待转化的整数。
  • str -- 存放字符串的空间。
  • radix -- 进制。
  • 返回值:
  • 转化后的字符串首地址。

示例:

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


int main()
{
   
    int num = 12345;
    char str[100];

    itoa(num, str, 10);
    printf("The string is: %s\n", str);
    itoa(num, str, 8);
    printf("The string is: %s\n", str);
    itoa(num, str, 5);
    printf("The string is: %s\n", str);
    itoa(num, str, 3);
    printf("The string is: %s\n", str);
    itoa(num, str, 2);
    printf("The string is: %s\n", str);
    itoa(num, str, 36);
    printf("The string is: %s\n", str);
    return 0;
}

输出:

The string is: 12345
The string is: 30071
The string is: 343340
The string is: 121221020
The string is: 11000000111001
The string is: 9ix

自实现

🤨

11.strchr()函数

char strchr(char str,int ch)
返回字符串 str 中首次出现字符 c 的位置指针,找不到返回 NULL。

语法:



char *strchr(char* str,int ch)

参数:

  • str -- 字符串。
  • ch -- 要查找的字符。
  • 返回值:
  • 字符串中首次出现字符 c 的位置指针,找不到返回 NULL。
  • 示例:
#include <stdio.h>
#include <string.h>
int main()
{
   
    char buf[100] = "china";
    char *p = strchr(buf,'n');
    printf("%s\n",p);
    return 0;
}

输出:

na

统计一个字符在字符串内出现的次数


int calcCharCountOfString(char * str, char ch)
{
   
    int count = 0;
    while(*str != '\0')
    {
   
        if(ch == *str)
        count++;
        str++;
    }
    return count;
}
int calcCharCountOfString(char * str, char ch)
{
   
    int count = 0;
    while(str = strchr(str,ch))
    {
   
        count++;
        str++;
    }
    return count;
}

自实现:

char * myStrchr(char *str, int ch)
{
   
    while(*str != ch&& *str != '\0')
        str++;
    if(*str == '\0')
        return NULL;
    else
        return str;
}

12.strspn()函数

函数 int strspn(const char s, const char accept)
返回字符串 s 中,从左到右,第一个不在 accept 字符串中的字符的位置。

语法:

int strspn(const char *s, const char *accept)

参数:

  • s -- 字符串。
  • accept -- 字符集。
  • 返回值:
  • 字符串 s 中,从左到右,第一个不在 accept 字符串中的字符的位置。
  • 示例:
#include <stdio.h>
#include <string.h>
int main()
{
   
    char str[100] = "hello world";
    char accept[100] = "hel";
    int len = strspn(str, accept);
    printf("%d\n", len);
    return 0;
}

输出:

4

自实现:


13.strcspn()函数

函数 int strcspn(const char s, const char reject)
返回字符串 s 中,从左到右,第一个在 reject 字符串中的字符的位置。

语法:

int strcspn(const char *s, const char *reject)

参数:

  • s -- 字符串。
  • reject -- 要拒绝的字符集。

返回值:

  • 字符串 s 中,从左到右,第一个在 reject 字符串中的字符的位置。
  • 示例:
#include <stdio.h>
#include <string.h>
int main()
{
   
    char str[100] = "hello world";
    char reject[100] = "r";
    int len = strcspn(str, reject);
    printf("%d\n", len);
    return 0;
}

输出:

8

自实现:


14.strstr()函数

函数 char strstr ( char str1, const char* str2 );
函数搜索字符串 str2 在字符串 str1 中是否出现。找到所搜
索的字符串,则该函数返回第一次匹配的字符串的地址;如果未找到所
搜索的字符串,则返回 NULL。

语法:

char * strstr ( char * str1, const char* str2 );

参数:

  • str1 -- 被搜索的字符串。
  • str2 -- 要搜索的字符串。
  • 返回值:
  • 找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址;如果未找到所搜索的字符串,则返回 NULL。
  • 示例:
#include <stdio.h>
#include <string.h>
int main()
{
   
    char str1[] = "abcd123456efg";
    char str2[] = "1234";
    char *pf = strstr(str1,str2);
    if(pf != NULL)
        printf("%s\n",pf);
    else
        printf("find none\n");
    return 0;
}

输出:

123456efg

自实现:

#include <stdio.h>
#include <string.h>
char * myStrstr(char *s1,char *s2)
{
   
    int n = strlen(s2);
    for(;(s1 = strchr(s1,*s2))!=NULL;s1++)
    {
   
        if(strncmp(s1,s2,n)==0)
        return s1;
    }
    return NULL;
}

统计一个字符串在另一个字符串内出现的次数

int calcStrCountOfString(char * string, char* str)
{
   
    int count = 0;
    int len = strlen(str);
    while(string = strstr(string,str))
    {
   
        count++;
        string += len;
    }
    return count;
}

15.strtok()函数

函数 char strtok(char s, char *delim);
函数用来分割字符串,并返回分割后的字符串。
分解字符串为一组字符串。s 为要分解的字符串,delim 为分隔符字符
串。首次调用时,s 指向要分解的字符串,之后再次调用要把 s 设成 NULL。
strtok 在 s 中查找包含在 delim 中的字符并用 NULL('\0')来替换,直
到找遍整个字符串。

语法:

char *strtok(char *s, char *delim);

参数:

  • s -- 要分解的字符串。
  • delim -- 分隔符字符串。
  • 返回值:
  • 分割后的字符串。
  • 示例:
#include <stdio.h>
#include <string.h>
int main()
{
   
    char buf[] = "aaaaaaaaaa@bbbbbbbbbbbb@ccccccccccc@ddddddddd";
    char delim[] = "@"; // "@#"
    int size = sizeof(buf);
    for(int i=0; i<size; i++)
        printf("%c",buf[i]);
    putchar(10);
    strtok(buf,delim);
    for(int i=0; i<size; i++)
        printf("%c",buf[i]);
    putchar(10);
    strtok(NULL,delim); // strtok(buf,delim);
    for(int i=0; i<size; i++)
        printf("%c",buf[i]);
    putchar(10);
    strtok(NULL,delim); // strtok(buf,delim);
    for(int i=0; i<size; i++)
        printf("%c",buf[i]);
    putchar(10);
//第一个或是最后一个是分隔符,如何
    return 0;
}

输出:

aaaaaaaaaa@bbbbbbbbbbbb@ccccccccccc@ddddddddd
aaaaaaaaaa bbbbbbbbbbbb@ccccccccccc@ddddddddd
aaaaaaaaaa bbbbbbbbbbbb ccccccccccc@ddddddddd
aaaaaaaaaa bbbbbbbbbbbb ccccccccccc ddddddddd

使用示例

解析 linux 密码文件

#cat /etc/passwd
root:x:0:0:Superuser:/:
daemon:x:1:1:Systemdaemons:/etc:
bin:x:2:2:Ownerofsystemcommands:/bin:
sys:x:3:3:Ownerofsystemfiles:/usr/sys:
#include <stdio.h>
#include <string.h>
int main()
{
   


        char buf[] = "sys:x:3:3:Ownerofsystemfiles:/usr/sys:";
        char *p = strtok(buf,":");
        while(p != NULL)
        {
   
            printf("%s\n",p);
            p = strtok(NULL,":");
        }
        return 0;

}

输出:

sys
x
3
3
Ownerofsystemfiles
/usr/sys
相关文章
|
6月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
312 23
|
5月前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
109 1
一文彻底搞清楚C语言的函数
|
6月前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
268 15
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
|
6月前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
121 24
|
6月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
309 16
|
6月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
167 3
|
6月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
154 2
|
6月前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
126 1
|
7月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
266 10
|
7月前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
183 9