C语言----字符函数和字符串函数(2)

简介: C语言----字符函数和字符串函数

C语言----字符函数和字符串函数(1)https://developer.aliyun.com/article/1544411

4.strcpy的使用和模拟实现

功能:拷贝字符串

strcpy---cpoy string

strcpy在拷贝的过程中会将arr1里面的内容包括\0拷贝到arr2里面去

int main()
{
    char arr1[] = "hello world";
    char arr2[20] = { 0 };
 
    //现在想把arr1里面的hello world放到arr2里面去
    //我们可以用strcpy来实现
    strcpy(arr2, arr1);
    printf("%s\n", arr2);
 
 
    return 0;
}

注意注意:

被拷贝的字符串一定要包含'\0',保证strcpy遇到\0就能停止拷贝

1.源头的字符串中必须包含\0,没有\0,strcpy是不能结束的

2.目标空间必须足够大,以确保能存放原字符串

3.目标空间必须是可以修改的

int main()
{
    char arr1[] = "hello world";
    char* p = "xxxxxxxxxxxxxx";//常量字符串--不能修改
 
    strcpy(p, arr1);//会报错的
    return 0;
}
//模拟实现拷贝
char*my_strcpy(char*dest,const char*src)//传过来的是首元素的地址,返回值是目标空间的起始地址,所以就是char*
{
    //*dest指向的是arr2第
    // 一个元素,*src指向的是arr1第一个元素
    //保证这两个指针不为空指针
    /*assert(src != NULL);
    assert(dest != NULL);*/
    //另一种写法:
    assert(dest && src);//如果dest为空指针,那么括号内就为0,就是假的,就会报错
 
    char* ret = dest;//将dest存起来
    while (*src != '\0')
    {
        *dest=*src;
        //进行加加操作,换下一个字符和下一个位置进行交换
        src++;
        dest++;
    }//当这个循环结束的时候,\0还没有被拷贝进去
    //最后的时候,src已经++成为\0了,那么现在再次赋值就能将\0拷贝进去了
    *dest =* src;//这里处理的就是\0
    return ret;//直接返回目标空间的起始地址
 
}
int main()
{
    char arr1[] = "abcdef";//末尾隐藏\0
    char arr2[20] = { 0 };
    //1.直接打印arr2
    my_strcpy(arr2, arr1);
    printf("%s\n", arr2);
 
 
    //2.接收返回值
    char* p = my_strcpy(arr2, arr1);
    printf("%s\n", p);
    //直接将返回值放到打印里面也可以
 
    printf("%s\n", my_strcpy(arr2, arr1));
    return 0;
}
 
 
//这个函数返回的是char*,为的是实现链式访问
 
//strcpy函数返回的是字符串拷贝成功过后,目标空间的起始地址,
//返回值就是arr2的首元素的地址
 
 
 
//总结:
//将arr1拷贝到arr2后,我们可以通过三种方法直接打印arr2
//一种就是直接打印arr2
//还有一种就是根据这个拷贝函数的返回值进行打印
//返回值是一个地址,在函数的一开始我们就将目标函数赋值给另一个临时指针,那么这个临时指针就指向了arr2
//在拷贝过后,我们直接将这个临时指针返回,所以在函数的开头我们用char*
//在返回了临时指针后,我们在主函数就用再创建一个临时指针变量进行返回值的接受,
//因为这个临时指针变量指向的是arr2的其实元素,那么我们就可以用这个临时指针变量直接打印arr2
//有了字符串起始元素的地址,我们就能打印这个字符串了
//对函数部分进行改进,
//思考:能不能将拷贝\0和前面的字符串放在一起呢?
 
char*my_strcpy(char*dest,const char*src)
{
 
    assert(dest && src);
 
    char* ret = dest;
    while (*dest++ = *src++)//因为这里是后置++,所以先带进去数据进行解引用,再进行++
    {
     //arr1里面的字符通过*dest++ = *src++这个代码一个个拷贝到arr2里面去了
      //在最后,*src是\0拷贝过去了,然后因为while循环里面是\0,所以循环停止了
      // 但是\0拷贝到dest里面了 
        ;
 
    }//这个循环拷贝过去之后判断表达式的值
    //因为是后置++,所以延后产生
 
    return ret;
 
}
 
int main()
{
    char arr1[] = "abcdef";
    char arr2[20] = { 0 };
 
    my_strcpy(arr2, arr1);
    printf("%s\n", arr2);
 
 
 
    char* p = my_strcpy(arr2, arr1);
    printf("%s\n", p);
 
 
    printf("%s\n", my_strcpy(arr2, arr1));
    return 0;
}

5.strcat的使用和模拟实现

原字符串必须有\0结尾

目标字符串也得有\0,否则没办法知道从哪里开始

目标空间必须足够大,能容纳下字符串的内容

目标空间是可以进行修改的,而不是常量不能进行修改

int main()
{
    char arr1[20] = "hello ";
    char arr2[] = "world";
 
    //如何将arr2里面的字符串追加在arr1后面呢?
    strcat(arr1, arr2);//字符串追加
    printf("%s\n", arr1);
    return 0;
}
 
//这个函数是如何实现追加呢?
//先找到目标函数的末尾\0的位置
//再将原字符串拷贝过来
 
//要求目标字符串末尾有\0,因为后面要将原字符串拷贝过去,所以原字符串也要有\0
//要返回目标空间的起始地址
//目标空间是可修改的,但是源头需要进行限制,不能被修改
char* my_strcat(char* dest,const char* src)//返回类型为char*类型的
//dest指向的是arr1的首元素的地址
//src指向的是arr2首元素的地址
{
    char* ret = dest;//将起始位置存起来
    assert(dest && src);//进行断言,防止空指针
    //1.找目标空间的\0
    while (*dest != '\0')
    {
        dest++;
    }//while循环找到\0就停下来
    //2.拷贝----我们在字符串追加的时候,我们要将目标字符串末尾的\0覆盖掉
    while (*dest++ = *src++)//这个代码是进行字符串间的拷贝的,因为上面已经找到\0了,已经停止循环了,并且dest指向了arr1末尾的\0
 
    {
        ;//写个分号就行了,循环得有一个循环语句
    }
 
    return ret;//直接返回arr1的起始地址
}
int main()
{
    char arr1[20] = "hello ";
    char arr2[] = "world";
 
    //如何将arr2里面的字符串追加在arr1后面呢?
    my_strcat(arr1, arr2);//字符串追加
    printf("%s\n", arr1);
    return 0;
}
 
//这个函数是如何实现追加呢?
//先找到目标函数的末尾\0的位置
//再将原字符串拷贝过来
 
//要求目标字符串末尾有\0,因为后面要将原字符串拷贝过去,所以原字符串也要有\0
 
 
 
//总结: 我们应该先找到目标字符串末尾\0的位置,这样我们才好追加,
//切记:追加的时候我们要将目标字符串末尾的\0覆盖掉
 
 
//在这个追加函数我们用了两个循环,第一个循环是找到\0,第二个循环是将原字符串拷贝到目标字符串的后面去

我们是不能对一个数组自己进行追加的

6.strcmp的使用和模拟实现

strcmp是用来比较两个字符串的

返回值是int

用返回值来比较这两个字符串大小

比较的是对应位置上的字符,如果对应位置字符相等就比较下一对字符

比较的不是字符串的长度,而是对应位置上字符的大小

如果两个字符串相等,返回值就是0

如果前面的字符串大于后面的字符串,那么就会返回一个大于0的数字

如果是后面的字符串大于前面的字符,前面的字符小,就返回一个小于 0的数字

int main()
{
    char arr1[] = "abcdef";
    char arr2[] = "abq";
    int ret=strcmp(arr1, arr2);
    //printf("%d\n", ret);//输出的结果是-1,就说明arr1<arr2
    if (ret == 1)//仅仅在vs平台可以写返回值为1,其他的平台就不知道返回值是多少了
    {
        printf(">" );
    }
    else
    {
        printf("<=");
    }
    return 0;
}
//
//int main()
//{
//    char arr1[] = "abcdef";
//    char arr2[] = "abq";
//    int ret=strcmp(arr1, arr2);
//    //printf("%d\n", ret);//输出的结果是-1,就说明arr1<arr2
//    if (ret == 1)//仅仅在vs平台可以写返回值为1,其他的平台就不知道返回值是多少了
//    {
//        printf(">" );
//    }
//    else
//    {
//        printf("<=");
//    }
//    return 0;
//}
 
 
//int my_strcmp(const char*str1,const char*str2)//返回值是Int,并且加上const进行限制
//{
//    //我们一对一对字符进行比较
//    assert(str1 && str2);
//    while (*str1 == *str2)
//    {
//        if (*str1 == '\0')//如果str1在上一轮循环++到\0之后,就说明这两个字符串已经完全相等了
//        {
//            return 0;//两个字符串完全相等
//        }
//        str1++;
//        str2++;
//    }//两个字符相等我们就找下一对字符进行比较
//    if (*str1 > *str2)
//    {
//        return 1;
//    }
//    else//*str1 < *str2
//    {
//        return -1;
//    }
//}
 
//另一种写法
int my_strcmp(const char* str1, const char* str2)//返回值是Int,并且加上const进行限制
{
    //我们一对一对字符进行比较
    assert(str1 && str2);
    while (*str1 == *str2)
    {
        if (*str1 == '\0')//如果str1在上一轮循环++到\0之后,就说明这两个字符串已经完全相等了
        {
            return 0;//两个字符串完全相等
        }
        str1++;
        str2++;
    }//两个字符相等我们就找下一对字符进行比较
    return (*str1 - *str2);//直接返回他们相减的值
 
}
int main()
{
    char arr1[] = "abcdef";
    char arr2[] = "abcdef";
    int ret=my_strcmp(arr1, arr2);
    printf("%d\n", ret);
    return 0;
}

C语言----字符函数和字符串函数(3)https://developer.aliyun.com/article/1544419

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