前言
本篇内容为两道练习题,以加强对前面四节课的巩固。
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上编译不通过。