C基础day9(2023.7.11)

一、Xmind整理:

二、课上练习:

 练习1:实现字符串逆置

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
	char str[]="hello";
	char *p=str;
	char *q=str+strlen(str)-1;
	while(p<q)
	{
		char t=*p;
		*p=*q;
		*q=t;
		p++;
		q--;
	}
	puts(str);
	return 0;
}

 练习2:值传递 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void fun(int a)
{
    printf("a=%d\n",a);
}
void fun_p(int *p)
{
    printf("p=%p\n",p);
}
int main(int argc, const char *argv[])
{
    int a=100;
    int arr[]={11,22,33};
    int *p=&a;//p=&a  *p=a
    fun(a);
    fun(arr[0]);
    fun(*p); 
    fun_p(&a);
    fun_p(arr);
    fun_p(p);
    return 0;
}

 练习3: 指针和一维数组

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void fun(int *arr,int len)
{
	int *p=arr;
	for(int i=0;i<len;i++)
	{
	//	printf("arr[%d]=%d\n",i,arr[i]);
	//	printf("%d ",*(arr+i));
	//	printf("%d ",*(&arr[0]+i));
	//	printf("arr[%d]=%d\n",i,p[i]);
	//	printf("%d ",*(p+i));
	//	printf("%d ",*(&p[0]+i));
	//	printf("%d ",*p++);
	//	printf("%p\t",&arr[i]);
	//	printf("%p\t",arr+i);
	//	printf("%p\t",&arr[0]+i);
	//	printf("%p\t",&p[i]);
	//	printf("%p\t",&p+i);
	//	printf("%p\t",&p[0]+i);
		printf("%p\t",p++);
		}
}
int main(int argc, const char *argv[])
{	
	int arr[]={11,22,33,44};
	int len=sizeof(arr)/sizeof(arr[0]);
	fun(arr,len);
  	return 0;
}

 练习4:使用指针实现冒泡排序、简单选择排序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void Bubble(int *p,int n)
{
	for(int i=1;i<n;i++)
	{
	    int count=0;
		for(int j=0;j<n-i;j++)
		{
			if(*(p+j)>*(p+j+1))
			{
				int t=*(p+j);
				*(p+j)=*(p+j+1);
				*(p+j+1)=t;
				count++;
			}
		}
		if(count==0)
			break;
	}
	for(int i=0;i<n;i++)
	{
		printf("%d\t",p[i]); 
	}
	printf("\n");
}
void Sort(int *q,int n)
{
	for(int i=0;i<n-1;i++)
	{
		int max=i;
		for(int j=i+1;j<n;j++)
		{
			if(*(q+max)<*(q+j))
			{
				max=j;
			}
		}
		if(max!=i)
		{
			int t=*(q+max);
			*(q+max)=*(q+i);
			*(q+i)=t;
		}
	}
	for(int i=0;i<n;i++)
	{
		printf("%d\t",*(q+i));
	}
	printf("\n");
}
int main(int argc, const char *argv[])
{
	int m,n;
	printf("请问你要输入一个几位数组:");
	scanf("%d",&n);
	int arr[n];
	for(m=0;m<n;m++)
	{
		printf("请输入第%d个数:",m+1);
		scanf("%d",&arr[m]);
	}
	Bubble(arr,n);
	Sort(arr,n);
	return 0;
}

 练习5:指针指向字符数组的地址

int main(int argc, const char *argv[])
{
    char str[]="hello";//str在栈区,字符串"hello"在只读区,
                       //把字符串常量复制一份给str 
    char *p=str;//p=str   //p内存在栈区,p指向栈区str首地址
    *p='H';
    //正确,p修改栈区的内容
    puts(str);
    puts(p);
}

 练习6: 定义数组str,指针p,通过p指向str

              通过指针实现输入

              通过指针把大小转换小写

              通过指针实现输出

#include <stdlib.h>
int main(int argc, const char *argv[])
{
    char str[20];
    char *p=str;
    printf("please enter p:");
    gets(p);
    for(int i=0;i<strlen(p);i++)
    {
        if(*(p+i)>='a'&&*(p+i)<='z')//if(str[i]>='a'&&str[i]<='z')
        {
            *(p+i)-=32;
        }
    }
    printf("%s\n",p);
    return 0;
}

 练习7:实现字符串连接 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void my_strcat(char *dest,char *src)
{
	int i=0;
	for(i=0;*(dest+i)!='\0';i++);
	for(int j=0;*(src+j)!='\0';j++)
	{
		*(dest+i++)=*(src+j);
	}
	*(dest+i)='\0';
}
int main(int argc, const char *argv[])
{
	char dest[20]="das";
	char src[20]="ewew";
	my_strcat(dest,src);
	puts(dest);
	return 0;
}

三、课后作业:

 1.下面的代码有什么错误

void test()
{
	char string[10];
	char *str1="0123456789";
	strcpy(string,str1);
 }

 答:这里声明的是一个字符串长度为10的数组,但"0123456789"的长度为11,在将str1拷贝          至string时,会导致数组越界。

        ①当越界访问的空间没有被占用,可以正常访问,输出垃圾值;

        ②当越界访问的空间被占用,但是不是重要的数据,可以访问,输出垃圾值 ​;

        ③当越界访问的空间被占用,并且存储重要的数据,不可以访问,段错误。

 2.请问一下代码有什么问题 

int main()
{
	char a;
	char *str=&a;
	strcpy(str,"hello")
	printf(str)
	return 0;
}

答:共有两处错误。

       ①在定义一个字符串数组的时候,不能直接定义为a,定义为a指向的是单字符a的地址,它只能容纳一个字节大小,所以在函数将字符串“hello”复制给str时,会导致越界;

       ②strcpy(str,"hello")与printf(str)两个语句,未使用分号结束。 

 3.有什么错?

char* s="AAA";
printf("%s",s);
s[0]='B';
printf("%s",s);

答:指针s指向的是字符串常量,字符串常量在只读区,只能读取不能修改,s[0]='B'表示对字符串常量的第一个值进行修改,所以会报错,出现段错误 。

 4.下面是一段计算0……100累加和的代码,请指出这段代码中的错误。

int main()
{
	int *MyData;
	int Count=100;
	int Sum,i;
	for(i=0;i<Count;i++){
		*MyData++=i;
	}
	for(i=0;i<Count;i++){
	Sum+=*MyData;
	MyData++;
	}
	return Sum;
}

答:共有两处错误。

       ①i<Count,使得i=100时无法进入循环;

       ②int *MyData定义的是一个野指针,未被初始化的指针会造成计算机混乱,甚至死机【计算机随机的地址,不确定,不正确】;  

       ③sum没有初始化,未清零。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值