调试的基本步骤
发现程序错误的存在
以隔离消除等方法对错误进行定位
确定错误产生的原因
提出纠正错误的解决办法
对程序错误予以改正、重新测试
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);
}