实验五 指针与字符串实验
一、 实验目的和要求
(1)重点掌握一级指针的定义与使用,会利用一级指针进行间接访问等操作。通过调试器观察分析程序的运行情况,理解指针与指针所指向的内容之间的关系,理解指针间接引用的实质。
(2)综合运用函数、数组和指针的知识,理解函数中指针形式参数的意义,数组名形参实质就是指针形参。通过跟踪调试理解传值与传地址的不同,及指针形参如何改变对应的实参变量。
(3)正确使用字符数组及字符指针处理字符串。
(4)进一步熟悉数组中经典算法的实现,并且能运用到字符串的处理中。
二、实验环境(实验设备)
硬件: 微型计算机
软件: Windows 操作系统、Microsoft Visual Studio 2010
三、实验原理及内容
实验题目(1)【见实验教材实验六的题目2】:编程exp6_2.c,现有整型变量x,y,调用交换函数以期实现两个值的交换。下表中4种不同的定义及调用分别进行测试并填写表格。
表1 拟实现交换的四种方法
实验解答:
① 主函数代码如下:
int main()
{
int x=1,y=2;
swap1(x,y); /*此处依次换成另外3种调用进行观察,其余代码不变*/
printf("x=%d,y=%d\n",x,y);
return 0;
}
实验题目(2)【见实验教材实验六的题目4】: 编写程序exp6_4.c,实现数组的逆置。如:int a[6]={1,3,4,5,6,7};逆置后int a[6]={7,6,5,4,3,1}
实验解答:
① 写出完整的源程序代码并做适当注释:
#include<stdio.h>
#include<string.h>
#define N 100
int reverse(int *b,int n);
int main()
{
int str[N],i,n;
printf("请输入个数:\n");
scanf("%d",&n);
printf("请输入一个数组:\n");
for(i=0;i<n;i++)
scanf("%d",&str[i]);
reverse(str,n);
printf("逆置后:");
for(i=0;i<n;i++)
printf("%d",str[i]);
return 0;
}
int reverse(int *b,int n)//逆置函数
{
int t,*p=&b[n-1];
while(b<p)
{
t=*b;
*b=*p;
*p=t;
b++;
p--;
}
return *b;
}
②运行一次程序,记录程序运行的结果:
请输入个数:
5
请输入一个数组:
1 2 3 4 5
逆置后:
54321
实验题目(3)【见实验教材实验七的题目3】:编写程序exp7_3.c,从键盘读入一个字符串,去掉其中所有的空格得到一个新串后再输出(只能定义一个字符数组,不可以定义两个字符数组,可以根据编程需要定义字符指针以及其他变量)。
实验解答:
①写出完整的源程序代码并做适当注释:
include<stdio.h>
#include<string.h>
#define N 100
unsigned int strlen(const char *str);
char *strdel(char *str);
int main()
{
char str[N];
printf("please input a string:\n");
gets(str);
*str=*strdel(str);
puts(str);
return 0;
}
char *strdel(char *str)//去空格
{
int i,j;
for(i=0;i<strlen(str);i++)
{
if(str[i]!=32)
continue;
else
{
for(j=i;j<strlen(str);j++)
str[j]=str[j+1];
}
}
return str;
}
②按表中所给测试用例输入观察对应输出结果:
测试用例要求 输入的原始串 输出结果串
串中空格每处只有一个 A bcd 12 45 t Abcd1245t
至少有一处有连续多个空格字符 A bc 12 t Abc12t
字符串最前面是4个空格 A b 12 t Ab12t
你自己设计的测试用例 a e r t Aert
实验题目(4)【见实验教材实验七的题目2】:: 编写程序exp7_2.c,帮助小红从小明通过网络发送的两串字符串中,提取用户名和密码。
提取规则:将第一串字符串中所有的大小写字母按原序连起来,再按原序取奇数位就是用户名;将第二串中所有数字按原序连起来,再按原序取偶数位就是密码。例:小明发给小红的第一个字符串为“ag13re5D6s789h0R”,则源串大小字母按序连起来为“agreDshR”,所以用户名为“arDh”;第二个字符串为“UGa4fF6hHt97J89iK5i4L2P3”, 则源串数字按序连起来为“4697895423”,所以密码为“67943”。
实验解答:
① 写出完整的源程序代码并做适当注释:
#include<stdio.h>
#include<string.h>
#define N 100
void get_id(char *str1);
void get_secret(char *str2);
int main()
{
char str1[N],str2[N];
int i;
printf("please input the first string with several abcs:");
gets(str1);
printf("please input the second string with several numbers:");
gets(str2);
get_id(str1);
printf("The id is:");
for(i=0;i<strlen(str1);i+=2)//注意奇数项
printf("%c",str1[i]);
printf("\n");
get_secret(str2);
printf("The secret is:");
for(i=1;i<strlen(str2);i+=2)//注意偶数项
printf("%c",str2[i]);
printf("\n");
return 0;
}
void get_id(char *str1)//获得用户名
{
char str3[N]="0";
int i,j=0;
for(i=0;i<strlen(str1);i++)
if((str1[i]>='a'&&str1[i]<='z')||(str1[i]>='A'&&str1[i]<='Z'))
{
str3[j]=str1[i];
j++;
}
strcpy(str1,str3);
}
void get_secret(char *str2)//获得密码
{
char str4[N]="0";
int i,j=0;
for(i=0;i<strlen(str2);i++)
if(str2[i]>='0'&&str2[i]<='9')
{
str4[j]=str2[i];
j++;
}
strcpy(str2,str4);
}
②记录程序运行结果,观察用户名和密码字符串的具体输出结果:
please input the first string with several abcs:ag13re5D6s789h0R
please input the second string with several numbers:UGa4fF6hHt97J89iK5i4L2P3
The id is:arDh
The secret is:67943
四、实验小结(包括问题和解决方法、心得体会、意见与建议、实验出错信息及解决方案等)
(一)实验中遇到的主要问题及解决方法
1、 字符串未初始化,会出现“烫烫烫”,了解情况后,初始化。
2、 子函数中返回字符串不成功,出现corrupt字眼,用复制函数解决问题,子函数不返回值。
(二)实验心得
1、逆置函数用交换。
2、字符串要初始化。
3、函数不能返回一个自动变量的字符串。
(三)意见与建议(没有可省略)
五、支撑毕业要求指标点
1.2-H掌握计算机软硬件相关工程基础知识,能将其用于分析计算机及应用领域的相关工程问题。
3.1-M掌握设计/开发复杂工程问题解决方案所需要的专业知识和开发工具。
转载:https://blog.csdn.net/qq_46392282/article/details/109365804