C语言学习笔记 入门篇-5

前言

本篇内容为两道练习题,以加强对前面四节课的巩固。

PS:本系列内容为程序媛学习C语言时做的笔记。以代码为主,并备注了打印结果以及详尽的解释注释。希望对你有所帮助。
C语言笔记入门篇包含多篇内容,当前位置:第五篇
在这里插入图片描述

数组

题目:求printf的输出结果

#include <stdio.h>
int main() {
    int a[] = {6,4,8,3,1,2,9,7,0,5};

    // *(a+4)部分:a指向首元素地址 挪动到 第四个元素    *取出第四个元素内存地址的值 == 1
    // *(a+1)部分:a指向数组首元素(0元素)地址,然后挪动到第一个元素,*取出第一个元素内存地址的值 == 4
    // a[4] 挪动到第四个元素 内存地址的值,最终得1
    int result = a[*(a+*(a+4))];
    printf("result的值是:%d\n", result); // 输出1
    return 0;
}

截取str的一部分

题目:用多种方法实现对字符串的截取

char * str = "SunHL_";
char * result;
函数(result, str, 2, 5); 或者 函数(&result, str, 2, 5);
printf("%s\n", result); // 要求最终输出:nHL

三种实现方式:

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

void substrAction1(char *result, char *str, int start, int end) {
    char *temp = str; //定义临时指针,不破坏str指针
    int count = 0; //记录当前的位置
    while (*temp) {
        if (count >= start && count < end) {//判断是否在截取位置内
            *result = *temp;
            result++;//接收值位置挪动
        }
        temp++;//取值位置挪动
        count++;//当前位置挪动
    }
}

void substrAction2(char *result, char *str, int start, int end) {
    //注意:sizeof(str) = 4
    char *temp = str;
    char tempArr[end - start];// 合理分配,截取多少用多少,节约
    for (int i = start; i < end; ++i) {
        tempArr[i - start] = *(temp + i);
    }
//    *result = tempArr;
// 不能用*result = tempArr,因为substrAction2()方法在弹栈之后,会回收里面所有成员变量,包括tempArr
//解决方案1:用strcpy(如下)。  2:开辟堆空间,见substrAction3()
    strcpy(result, tempArr);
}

void substrAction3(char **result, char *str, int start, int end) {//二级指针的使用
    char *temp = str;
    char *tempArr = malloc(end - start);// 合理分配,截取多少用多少,节约
    int count = 0;
    for (int i = start; i < end; ++i) {
        tempArr[count] = *(temp + i);
        count++;
    }
    *result = tempArr;
    //这里不调用free,否则跟在栈区的arr一样了,要在substrAction3()调用拿到值之后再free。
    // 所以不推荐用堆区这种方式,因为自己方法开辟的空间要自己去释放。
}

void substrAction4(char *result, char *str, int start, int end) {
    //没有涉及栈区 堆区的概念
    for (int i = start; i < end; ++i) {// 刚好结束 循环三次
        *(result++) = *(str + i);
    }
}

void substrAction5(char *result, char *str, int start, int end) {
    // 参数1:我最终是copy到result容器里面
    // 参数2:拷贝位置从n开始
    // 参数3:从n拷贝到L
    strncpy(result, str + start, end - start);
}

int main() {
    char *str = "SunHL_";
    char result[100] = "ABC"; //见下面注意

    substrAction1(result, str, 2, 5);
    substrAction2(result, str, 2, 5);
   /*substrAction3(&result, str, 2, 5);//不推荐用这个
     if (result) {
        free(result);
        result = NULL;
    }*/
    substrAction4(result, str, 2, 5);
    substrAction5(result, str, 2, 5);

    printf("结果为:%s\n", result); // 最终输出:nHL
    return 0;
}

注意:
1:char *result = NULL;//(会报错,因为不准修改NULL值)
char *result = “ABC”;//(会报错,因为不准修改常量值)
char result[100] = “ABC”//在栈区开辟空间[推荐方式]

2:直接写char *result ,在vs上编译不通过。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值