调试技巧·

调试的基本步骤

发现程序错误的存在

以隔离消除等方法对错误进行定位

确定错误产生的原因

提出纠正错误的解决办法

对程序错误予以改正、重新测试

Debug和Release的介绍

Debug表示调试版本,Release表示发布版本

 

 

 优化后字节更少了

#include <stdio.h>
int main()
{
    int i = 0;
    int arr[10] = {0};
    for(i=0; i<=12; i++)
   {
        arr[i] = 0;
        printf("hehe\n");
   }
    return 0; }

优化后会导致变量在内存中的地址发生变化

VS常用快捷键

点我

调试——>窗口——>内存/监视/反汇编/调用堆栈/寄存器

调试案例

#include <stdio.h>
int main()
{
    int i = 0;
    int arr[10] = {0};
    for(i=0; i<=12; i++)
   {
        arr[i] = 0;
        printf("hehe\n");
   }
    return 0; }

刚好在i=12时,arr[12](越界了)的地址等于i的地址,因此arr[12]=0, i就等于0导致死循环;

优秀代码需要满足的条件

 模拟实现strcpy

 这个代码不够完善

void my_strcpy(char* dest, char* src)
{
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;
}

                5. 注释的添加 

 需要加入const 

assert断言防止空指针解引用

头文件是<assert.h>

尽量将调用函数返回给主函数 实现函数链接

printf("%s\n", my_strcpy(arr2, arr1));

代码可以添加注释

代码可更加简洁

修改后

//my_strcpy函数设计返回值类型是为了实现函数的链式访问
char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);//断言
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[] = "hello bit";
	char arr2[20] = "xxxxxxxxxxx";
	char* p = NULL;

	printf("%s\n", my_strcpy(arr2, arr1));

	return 0;
}

const的使用

使变量不能改变

 当一个变量加了const,用另一个指针可以取出该变量的地址将该变量的值改变,因此要给指针也加个const

 

const在指针的星号左右边会产生不一样的影响 

 

 

 

实现my_strlen函数

int my_strlen(const char* str)
{
	int count = 0;
	assert(str != NULL);

	while (*str++ != '\0')
	{
		count++;
	}
	return count;
}

int main()
{
	//int len = strlen("abcdef");
	int len = my_strlen("abcdef");

	printf("%d\n", len);
	return 0;
}
7.1 编译型错误
直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。

7.2 链接型错误
看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不
存在或者拼写错误。

7.3 运行时错误
想要的结果和得到的不同

逆序升级版

​
输入I like beijing.输出beijing.like I
1.先逆序整个字符串
2.逆序每个单词 知道各个的起始和结束即可

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void nixv(char* start,char* p)
{
	assert(start && p);//不能为空指针
	while (start <= p)
	{
		char b = *p;
		*p = *start;
		*start = b;
		start++;
		p--;
	}

}
int main()
{
	char arr1[100];//题目要求字符串长度为100之内
	gets(arr1);
	int sz=strlen(arr1);//可以计算所有字符串元素个数
	int right = sz - 1;
	int left = 0;
	while (right >= left)
	{
		char x = arr1[right];
		arr1[right] = arr1[left];
		arr1[left] = x;
		left++;
		right--;
	}
	char* start = arr1;
	char* p = arr1;
	while (*p!='\0')
	{
		while (*p != ' ' && *p != '\0')//空格表示用单引号
		{
			p++;
		}
		nixv(start, p - 1);
		start = p + 1;//此时的p是主函数的和被调函数的无关
		if (*p != '\0')
		{
			p++;//跳过空格防止死循环
		}//防止跳过字符串末尾'\0'
	}
	printf("%s", arr1);
}

​

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值