第八天———函数;GDB调试段错误

***段错误的原因:
(1)访问了不该访问的空间(空指针或者野指针)
(2)越界
(3)修改了常量区的内容***

针对段错误处理方法:
GDB调试:
流程:
(1)生成带有调试信息的文件
gcc -g test.c -o test
(2)进入该文件中
gdb test
(3)设置断点
b 行号/函数名
(4)让程序运行起来
r
(5)单步调试:
n (不进入子函数,但是函数调用的整个结果会被显示出来)/ s (此时子函数会进入,进入子函数内部进行每一行单步调试)
(6)如果看到(segementation default…)
(7)q (quit) 退出调试环境


1,函数: 功能单一的模块

函数的分类:
(1)库函数:已经封装好的函数,只留给调用者一个接口,然后调用者只需要正确传参使用即可
(2)自定义函数:用户自己定义的接口,用来实现特定的功能

int main(int argc,const char *argv[])
{
return 0;
}
子函数的定义:
格式:
数据类型1 函数名(数据类型2 变量名1,数据类型3 变量名2。。。。。)
{
函数体//代码的实现过程
返回值;
}

 分析: 
      数据类型1:返回值类型,如果没有返回值,则写成void
	  数据类型2:形式参数1的类型
	  变量名1:形参名1
	  数据类型3:形式参数2的类型
	  变量名2:形参名2
	  
	  返回值:可有可有

2,函数的声明
写法:直接拷贝函数头,在其末尾添加分号即可

  函数声明检查的是语法错误(参数的个数以及类型是否匹配)
  注意:声明中的形参名可以省略不写。(不起任何作用)

总结:
(1)调用函数时,实参可以为常量,变量,表达式均可
(2)实参和形参的个数以及类型均要匹配
(3)形参和实参可以重名(作用域不同)
(4)形参只有被调用时,才为其分配空间,当调用完成后,则被释放掉(形参相当于局部变量,存储在栈区)
(5)实参和形参是两块独立的内存空间

3,指针作为参数传参
解决问题:当需要通过子函数引起实参值改变的时候,需要将实参的地址作为参数传递给形参
因为地址时唯一的,通过操作地址(指针),就是在操作实参的那片空间。

传参的形式:
(1)值传递
(2)址传递

4,一维数组的传参
数组:
本质:连续的内存空间
操作数组就是操作空间

 对于操作空间,需要知道什么?
 (1)从哪里开始? ----》首地址
 (2)什么时候终止? ------》元素个数

作业:
1,定义一个带有空格的字符串,实现删除所有空格(子函数实现)

#include <stdio.h>
void delete_str_func(char *pStr);
void delete_str_func(char *pStr)
{
	//入参判断
	if(NULL == pStr)
	{
		printf("空指针!\n");
		return;
	}
	//定义一个指针指向数组的首元素
	char *p = pStr;
	//遍历字符串
	while(*p)
	{
		//判断是否为空格
		if(' ' == *p)
		{
			//定义一个指针,接替此时p的指向
			char *q = p;
			while(*q)
			{
				*q = *(q+1);
				q++;
			}
		}
		else
		{
			p++;
		}
	}

}
int main(int argc, const char *argv[])
{
	//定义一个数组
	char str[20] = {'\0'};
	printf("请输入一个带有空格的字符串:\n");
	gets(str);

	printf("删除之前的字符串: str =%s\n",str);

	delete_str_func(str);
	printf("删除之后的字符串: str =%s\n",str);
	return 0;
}

2,定义一个带有空格的字符串,实现将所有空格替换为%20(子函数实现)

#include <stdio.h>


void change_str_func(char *pStr)
{
	if(NULL == pStr)
	{
		printf("NULL_ERROR!\n");
		return;
	}
	//定义一个指针指向该字符串的首元素
	char *p = pStr;
	//定义一个变量,保存空格的个数
	int blank = 0;
	//定义一个变量,保存字符串的旧长度
	int len = 0;
	//遍历字符串
	while(*p)
	{
		if(' ' == *p)
		{
			blank++;
		}
		len++;
		p++;
	}
	//定义一个变量,保存替换之后的字符串新长度
	int all_len = len + (blank * 2);
	//定义两个变量,分别保存新旧字符串的最后一个有效字符的下标
	int j = all_len-1;
	int i = len-1;
	//恢复p的指向带首地址
	p = pStr;
	//从旧字符串最后一个元素开始往前遍历
	while(i >= 0)
	{
		if( ' ' == *(p+i) )
		{
			//将该位置以及前面两个位置用%20进行替换
			*(p+j) = '0';
			*(p+j-1) = '2';
			*(p+j-2) = '%';
			j -= 3;//j = j -3;
			i--;
		}
		else
		{
			*(p+j) = *(p+i);
			j -= 1;
			i--;
		}
	}
}
int main(int argc, const char *argv[])
{
	//定义一个字符串
	char str[100] = {0};

	printf("请输入一个带有空格的字符串:\n");
	gets(str);

	printf("替换之前的字符串: str =%s\n",str);

	change_str_func(str);

	printf("替换之后的字符串: str =%s\n",str);
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值