C博客作业05--2019-指针
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
1、指针与数组
数组求和
定义数组,指针
int a[N],*p;
给指针赋值//未赋值指针不能正常使用
sum=0
p=a//等价于p=&a[0]
for p=a to &a[N] do
p++;
sum+=*p//数值累加
end for
2、字符指针
指针表示字符串:
并不是将字符串放到字符指针变量中,而是占用一个存放地址的的内存单元储存值,值为字符串首字符的地址
char *s="string";//改变指针的值,可让它指向新的字符串s="hello"
指针字符串循环
定义字符指针char *s,str[20]//若指针无值可赋可先定义char *s=NULL
gets(str);//输入字符串遇回车结束(scanf("%s",数组名),遇空格或回车结束)
s=str
for(;*s!='\0';s++)
3、动态内存分配
根据运行时的实际存储需求分配适当的存储区
使指针指向获得的内存空间
使用完毕需释放free(获得分配的指针)
int *p;
p=(int*)malloc(n*sizeof(int))
free(p)
何时需要动态申请内存?
int *p;//定义了一个指向int类型的指针p
p是用来储存一个地址的值的,我们之所以要为p这个变量分配空间是让它有一个明确的指向
动态分配内存的方式来规定它的方向
4、二级指针、行指针
二级指针
行指针
数据类型:(*p)[m]
指向由m个元素组成的一维数组的行指针变量
5、指针数组及其应用
类型名 *数组名[数组长度]
若定义char *color[5]
则color[i]存放字符串首地址,分别指向一个字符串
若要交换指向单元
char *temp
temp=color[0];
color[4]=color[0];
6、指针做函数返回值及其注意
不能在实现函数返回在函数内部定义的局部数据对象的地址
因为所有的局部数据对象在函数返回时就会消亡
1.2 本章学习体会
1、对指针的定义和用法有了一定的了解
2、对于指针的使用大部分还是转为数组后再应用
3、对于指针指向问题,和指针指向内容的改变问题还是有点模糊
4、希望还能多讲讲指针方面的内容
周 | 代码量 |
---|---|
13、14 | 627 |
2.PTA实验作业
2.1 7-5 删除字符串中的子串
2.1.1 伪代码
定义主串、子串char str[N],subStr[N]
fgets输入主串子串
调用分装函数
void DelSubStr(char *str,char *subStr)
定义位置指针locPtr//查找子串在主串中的位置
len//求出子串长度len=len-1
舍去子串中的换行符
while ((locPtr = strstr(str, subStr)) != NULL)//能够在主串中查找到子串
{
将查找到的子串后的字符向前挪动len个位置
}
2.1.2 代码截图
2.1.3 总结本题的知识点
1.strstr函数用法及作用
搜索"子串"在"指定字符串"中第一次出现的位置
(1) 成功找到,返回在"指定字符串"中第一次出现的位置的 char *指针
(2) 若未找到,也即不存在这样的子串,返回: "NULL"
2.注意插入指针移动到哪里停止
3.注意计算子串长度时要舍去换行符
2.1.4 PTA提交列表及说明
1.段错误:未给while循环加退出条件(添加语句(locPtr = strstr(str, subStr)) != NULL调用strstr函数判断何时退出循环)
2.部分正确:测试数据0,格式错误。0测试点输出问题,直接复制PTA解决。
3.部分正确:未将换行符舍去导致输入错误(加入len--;//舍去换行符)
4.部分正确:未在字符串末尾添加结束标志(subStr[len] = '\0';)
2.2 7-3 字符串的冒泡排序
2.2.1 伪代码
定义number字符串个数
定义times扫描次数
定义二维字符数组str[N][20]//存放所要排序的字符串字符串
定义一维字符数组temp[N]//将所要交换的字符串先储存
for i=0 to number do
输入字符串str[i]
end for
for i=0 to times do
for j=0 to number-i-1 do
若前一个字符串大于后一个字符串strcmp(str[j],str[j+1])>0
交换两字符串strcpy
end for
end for
输出排序后字符串
2.2.2 代码截图
2.2.3 总结本题的知识点
1、strcmp函数
strcmp(str1, str2)
如果返回值 < 0,则表示 str1 小于 str2
如果返回值 > 0,则表示 str2 小于 str1
如果返回值 = 0,则表示 str1 等于 str2
2、strcpy函数
strcpy(目的字符串,源字符串)
会把源字符串指向的字符串复制到目的字符串
必须保证目的字符串足够大,能够容纳下源字符串,否则会导致溢出错误
3、注意冒泡排序法两层循环的停止位置
2.2.4 PTA提交列表及说明
1.多种错误:字符串比较直接用大于小于号导致比较错误(应用strcmp字符串比较函数strcmp(str[j],str[j+1])>0)
2.编译错误:调用函数时实参传递错误(改为二维字符数组)
3.部分正确:交换字符串内容出错(改用strcpy(temp, str[j]))
2.3 7-4 说反话-加强版
2.3.1 伪代码
定义一维字符指针str[N]
fgets输入字符串
调用函数
void ReverseOrderStr(char *beginPtr)
定义尾部指针endPtr=beginPtr
将endPtr指针定义到字符串尾部,且不收入换行符 while(*endPtr&&*endPtr!='\n')endPtr++;
遍历指针p=--endPtr
while(p!=beginPtr)指到第一个字符为止
{
若*p不是空格,则统计单词长度len
若*p不是空格但前一个字符是空格,则代表是一个单词,
输出从p开始len长度的字符串
p--
}
输出第一个单词
2.3.2 代码截图
2.3.3 总结本题的知识点
1、注意计算准确每个单词的长度
2、注意换行符的取舍
3、注意输出格式
2.3.4 PTA提交列表及说明
原来使用二维字符数组i++;a[i]存放一个单词后逆序输出
但是过不了最后一个测试点
最后还是用了超星上的方法
1.多种错误:第一个字符串的开头无法扫描进(多添加一个if语句继续扫描)
最后一个字符输出时换行(未把换行符排除,只需在循环语句中多添加一条*endPtr != '\n'就能使endPtr在扫到换行符时停止)
2.段错误:endPtr扫描错方向循环无法退出(改为endPtr++)
3.部分正确:输出格式不对,空格个数不是一个(判断输出时是否为第一个字符串)
3.阅读代码(-2--1分)
解题思路:
1、每次顺序读取两个值
2、如果前一个比后面小的话,就说明出现了上述六种特殊情况,用后一个值减去前一个值
3、如果前一个值大于后一个值,正常读取当前值即可
优点:
1、将特殊的六种情况分装另一个函数,增加了可读性,避免了代码重复