南京邮电大学C语言实验报告5v2(仅供参考)

实验五 指针与字符串实验

一、 实验目的和要求
(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掌握设计/开发复杂工程问题解决方案所需要的专业知识和开发工具。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值