ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-03-08 10:01:44  阅读:83  来源: 互联网

标签:end start int 笔记 C语言 char 入门篇 result str


前言

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

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;

    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;
}

标签:end,start,int,笔记,C语言,char,入门篇,result,str
来源: https://blog.csdn.net/hongli_sun/article/details/114520551

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有