C语言初阶——实用调试技巧(新课学习)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

strcpy 字符串拷贝

char * strcpy (char * destination, const char * source);

#include<string.h>//strcpy头文件
int main()
{
    char arr1[20] = { 0 };//char arr1[20] = "woshishui";
    char arr2[] = "hello";
    strcpy(arr1, arr2);
    printf("%s\n", arr1);

    return 0;
}

函数实现

void my_strcpy(char* dest, char* src)
{
    while (*src != '\0')
    {
        *dest = *src;
        dest++;
        src++;
    }
    *dest = *src;
//拷贝'\0'
}
int main()
{
    char arr1[20] = "woshishui";
    char arr2[] = "hello";
    my_strcpy(arr1, arr2);
    printf("%s\n", arr1);

    return 0;
}

优化

void my_strcpy(char* dest, char* src)
{
    while (*dest++ = *src++)
//'\0'的ASCII码值为0
    {
        ;
    }
}
int main()
{
    char arr1[20] = "woshishui";
    char arr2[] = "hello";
    my_strcpy(arr1, arr2);
    printf("%s\n", arr1);

    return 0;
}

当source无指向,为空指针时,那么解引用时就会出现问题——读取访问权限冲突,程序挂了。

再优化

#include<assert.h>
void my_strcpy(char* dest, char* src)
{
    
//if (dest == NULL || src == NULL)//判断指针的有效性。
    //{
    //    return;
    //}//这里虽然在遇到空指针,不执行代码,直接返回,拦截了空指针的问题,但没有报错,没有暴露问题,不易找出错误代码。

    //断言
    //assert中放一个表达式,表达式的结果为假,则报错;结果为真,则正常往下运行。//即,只能判断真假。

    assert(dest != NULL);
    assert(src != NULL);

    //也可以写成:assert(dest && src);

    while (*dest++ = *src++)//'\0'的ASCII码值为0
    {
        ;
    }
}
int main()
{
    char arr1[20] = "woshishui";
    char *p = NULL;
    my_strcpy(arr1, p);
    printf("%s\n", arr1);

    return 0;
}

const


const修饰指针变量时
1.const放在*的左边,修饰的是指针指向的内容,表示指针指向的内容不能通过指针来改变,但是指针变量本身可以被修改。
2.const放在*的右边,修饰的是指针变量本身,表示指针变量本身的内容不能被改变,但是指针指向的内容可以通过指针来改变。

库函数strcpy返回的是目标空间的起始位置

#include<assert.h>
char * my_strcpy(char* dest, char* src)
{
    assert(dest && src);
    char* ret = dest;
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}
int main()
{
    char arr1[20] = "woshishui";
    char* p = NULL;

    //链式访问:
    printf("%s\n", my_strcpy(arr1, p));//打印字符串:从起始位置开始。

    return 0;
}


练习:

求字符串长度

strlen

#include<string.h>
int my_strlen(char* arr)
{
    int count = 0;
    while (*arr != '\0')
    {
        arr++;
        count++;
    }
    return count;
}
int main()
{
    char arr[] = "abcdef";
    
    printf("%d\n", my_strlen(arr));
    return 0;
}

使用const

#include<string.h>
#include<assert.h>

int my_strlen(const char* arr)
{
    int count = 0;
    assert(arr != NULL);
    while (*arr != '\0')
    {
        arr++;
        count++;
    }
    return count;
}
int main()
{
    char arr[] = "abcdef";

    printf("%d\n", my_strlen(arr));
    return 0;
}

标准答案:

#include<string.h>
#include<assert.h>

unsigned int my_strlen(const char* arr)
//size_t my_strlen(const char* arr)//strlen返回类型:size_t——unsigend int
{
    unsigned int count = 0;
    assert(arr != NULL);
    while (*arr != '\0')
    {
        arr++;
        count++;
    }
    return count;
}
int main()
{
    char arr[] = "abcdef";

    printf("%d\n", my_strlen(arr));
    return 0;
}

上一篇:PD虚拟机不能复制Mac的文件怎么回事 PD虚拟机不能复制Mac的文件怎么办 Parallels Desktop怎么用-二、PD虚拟机不能复制Mac的文件怎么办


下一篇:算力互联网网络架构;SRV6;智享WAN