-
2021-05-24 03:55:19
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
例子:
char* strcpy(char*
dest,char* source)
{
assert(source!=0);
assert(dest!=0);
char* returnstring
= dest;
while((*dest++ =
*source++)!= ‘\0’)
{
;
}
return
returnstring;
}
2、防御性的编程
例子: char* strcpy(char* dest,char* source)
{
if(source == 0)
{
assert(false);
reutrn 0;
}
if(dest == 0)
{
assert(false);
return 0;
}
char* returnstring
= dest;
while((*dest++ =
*source++)!= ‘\0’)
{
;
}
return
returnstring;
}
3、使用Trace
以下的例子只能在debug中显示,
例子:
a)、TRACECString csTest = “test”;
TRACE(“CString is %s\n”,csTest);
b)、ATLTRACE
c)、afxDump
CTime time =
CTime::GetCurrentTime();
#ifdef _DEBUG
afxDump <<
time << “\n”;
#endif
4、用GetLastError来检测返回值,通过得到错误代码来分析错误原因
5、把错误信息记录到文件中
异常处理
程序设计时一定要考虑到异常如何处理,当错误发生后,不应简单的报告错误并退出程序,应当尽可能的想办法恢复到出错前的状态或者让程序从头开始运行,并且对于某些错误,应该能够容错,即允许错误的存在,但是程序还是能够正常完成任务。
调试技巧
1、VC++中F5进行调试运行
a)、在output Debug窗口中可以看到用TRACE打印的信息
b)、 Call Stack窗口中能看到程序的调用堆栈
2、当Debug版本运行时发生崩溃,选择retry进行调试,通过看Call
Stack分析出错的位置及原因
3、使用映射文件调试
a)、创建映射文件:Project settings中link项,选中Generate mapfile,输出程序代码地址:/MAPINFO:
LINES,得到引出序号:/MAPINFO: EXPORTS。
b)、程序发布时,应该把所有模块的映射文件都存档。
c)、查看映射文件:见” 通过崩溃地址找出源代码的出错行”文件。
4、可以调试的Release版本
Project settings中C++项的Debug Info选择为Program
Database,Link项的Debug中选择Debug Info和Microsoft
format。
5、查看API的错误码,在watch窗口输入@err可以查看或者@err,hr,其中”,hr”表示错误码的说明。
6、Set Next Statement:该功能可以直接跳转到指定的代码行执行,一般用来测试异常处理的代码。
7、调试内存变量的变化:当内存发生变化时停下来。
常见错误
1、在函数返回的时候程序崩溃的原因
a)、写自动变量越界
b)、函数原型不匹配
2、MFC
a)、使用错误的函数原型处理用户定义消息
正确的函数原型为:
afx_msg LRESULT
OnMyMessage(WPARAM wParam,LPARAM lParam);
3、谨慎使用TerminateThread:使用TerminateThread会造成资源泄漏,不到万不得已,不要使用。
4、使用_beginthreadex,不要使用Create
Thread来常见线程。
调试常用快捷键
单步进入
F11
单步跳过
F10
单步跳出
SHIFT+F11
运行到光标
CTRL+F10
开关断点
F9
清除断点
CTRL+SHIFT+F9
Breakpoints(断点管理)
CTRL+B 或ALT+F9
GO
F5
Compile(编译,生成.obj文件)
CTRL+F7
Build(组建,先Compile生成.obj再Link生成.exe)
F7
[番茄花园1]这是什么文件???
[番茄花园2]???
[番茄花园3]???
更多相关内容 -
C语言第八课,调试技巧
2022-01-21 14:45:27调试的技巧:快捷键、需要关注的变量。 如何写出方便维护的代码:使用const修饰变量 和assert()函数。目录
什么是调试
调试(英语:Debugging / Debug),又称除错,编好程序后,用各种手段进行查错和排错的过程。作为程序的正确性不仅仅表现在正常功能的完成上,更重要的是对意外情况的正确处理。
修正语法错误和逻辑错误的过程。这是保证计算机信息系统正确性的必不可少的步骤。编完计算机程序,必须送入计算机中测试,修正逻辑错误和语法错误。2.2 调试的基本步骤
首先程序员在写程序在写代码的时候可以发现错误,如果没有发现自己的bug,就把他的代码调成release版本,给测试人员。测试工程师以用户的角度也可以发现程序中的错误,会上报给程序员重新更改程序,如果没有发现bug,就会发布给用户。用户在使用产品的时候,也有可能发现bug。当用户发现bug的时候,就会有风险了,例如付费软件给用户带来了损失。
- 发现程序错误的存在
- 以隔离、消除等方式对错误进行定位
- 确定错误产生的原因
- 提出纠正错误的解决办法
- 对程序错误予以改正,重新测试
2.3 Debug和Release的介绍
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优
的,以便用户很好地使用。Windows环境调试
在环境中选择 debug 选项,才能使代码正常调试。
快捷键的使用
在使用快捷键之前,应该先把键盘上的Fn激活!
(原因是现在的电脑兼具娱乐的功能,F1~F12在Fn没激活时,充当音量、亮度调节等功能的快捷键)
F5
启动调试,经常用来直接跳到下一个断点处。如果没有断点,直接运行到最后一步!F9
创建断点和取消断点
可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。F5和F9配合使用。比如我前100行代码都没有问题,101行出现了问题,我不可能从第一行去慢慢调试。正确的做法是设置断点,然后直接跳到断点处,断点之前的代码就不需要观察了。
F10
逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。F11
逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的)。CTRL + F5
开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。调试的时候查看程序当前信息
以下的一切操作都是在调试的时候进行,否则无效。
1 查看内存信息
按照如图所示的位置查看内存窗口,如果屏幕足够大,当然可以打开多个窗口。
调试实例:
2 查看临时变量的值调试——>窗口——>监视——>监视1
在调试开始之后,用于观察变量的值。这个是使用的最多的。
3 查看调用堆栈
调试——>窗口——>调用堆栈
用于观察整个函数的调用逻辑,以这样一个简单的代码举例:void test2() { printf("test2\n"); } void test1() { printf("test1\n"); test2(); } void test() { printf("test\n"); test1(); } int main() { test(); return 0; }
按下F10进入调试,然后调用堆栈。按F11逐语句调试。可以看到这个代码的函数调用逻辑。
4 查看汇编信息
方法1:调试——>窗口——>反汇编(Alt + 8)方法2:右击鼠标——>反汇编(Ctrl+K,G)
以汇编语言的形式展示。5 查看寄存器信息
调试——>窗口——>寄存器☀如何写出易于调试的代码
优秀的代码往往要求运行正常、 bug很少、效率高、可读性高、可维护性高、注释清晰、文档齐全。
常见的coding技巧:
- 使用assert
- 尽量使用const
- 养成良好的编码风格
- 添加必要的注释
- 避免编码的陷阱。
我们可以学习一下C语言的库函数是如何写的。以strcpy为例,查找MSDN可知
下面我将以这个作为测试的代码,模拟出不同层次的strcpy函数。#include<string.h> int main() { //strcpy 字符串拷贝 char arr1[20] ="xxxxxxxxx"; char arr2[] = "hello"; strcpy(arr1, arr2); //my_strcpy(arr1, arr2); printf("%s\n", arr1);//字符串拷贝把\0也拷贝进去了 return 0; }
将自己写的函数命名为my_strcpy()
写法一:
只能得到一半的分数。比如这个代码,如果我输入的是空指针那么程序就不能运行!void my_strcpy(char* dest, char* src) { while (*src != '\0') { *dest = *src; dest++; src++; } *dest = *src;//把最后的\0拿过来 }
写法二:
这次就能得到七成的分数。需要引入assert()断言函数,防止空指针的传入。#include<assert.h> void my_strcpy(char* dest, char* src) { assert(dest != NULL);//防止传入空指针 assert(src != NULL); while (*src != '\0') { *dest = *src; dest++; src++; } *dest = *src;//把最后的\0拿过来 }
写法三:
注意别人的函数的返回值是char*类型的,而我们写的是void类型的,如果不保持一致的话那还有仿写的意义吗?
如果返回的目标空间的地址,那么就可以这样调用:printf("%s\n", my_strcpy(arr1, arr2)),代码更加灵活!char* my_strcpy(char* dest, char* src) { assert(dest && src); char* ret = dest;//将dest 的地址保存 while ('\0'!=src) { *dest = *src; dest++; src++; } return ret;//返回dest的地址 }
写法四:
加上const修饰变量,防止被拷贝的和拷贝的数据写错位置了。char* my_strcpy(char* dest,const char* src) { assert(dest && src); char* ret = dest;//将dest 的地址保存 while ('\0'!=src) { *dest = *src; dest++; src++; } return ret;//返回dest的地址 }
如此一来,就写出了满分代码!
☀ const 的使用方法
const修饰整型变量(这一类的)后,本身不能改变,但是可以通过指针变量p来改变。
int main() { const int n = 10; //n = 20;//不行 int* p = &n; *p = 20;//通过指针变量修改n的值 printf("%d", n); return 0; }
const 放在*左边
const 修饰的指针指向的内容,表示**“指针指向的变量内容”不能修改;**
但是,“指针变量本身”是可以改变的。int main() { const int n = 10,m=200; //n = 10; const int* p = &n; //*p = 20;//不能实现,因为 指针指向的内容 不能通过指针来改变。 int** pp = &p; **pp = 20;//不过可以使用二级指针改变n p = &m;//可以实现 printf("n=%d,m=%d\n", n,m); return 0; }
const如果放在*的右边
const修饰的是指针变量本身,保证了**“指针变量的内容”不能修改**;
但是“指针指向的内容”,可以通过指针改变。int main() { int m = 10,n=100; int* const p = &n;//指向了n //p = &m;//指针变量的内容 不能修改,只能够指向n了 *p = 20;//指向的n可以修改 printf("%d %d\n", m, n); return 0; }
编程常见的错误
1 编译型错误
直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。
2 链接型错误
看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不
存在或者拼写错误。
3 运行时错误
借助调试,逐步定位问题。最难搞。一些调试的实例
实例一
求1!+2!+3!+……+n!
int main() { int i = 0; int sum = 0;//保存最终结果 int n = 0; int ret = 1;//保存n的阶乘 scanf("%d", &n); for (i = 1; i <= n; i++) { int j = 0; for (j = 1; j <= i; j++) { ret *= j; } sum += ret; } printf("%d\n", sum); return 0; }
可以看出这个代码成功运行,但是结果错的离谱
通过调试,我们可以发现ret的值在循环的时候没有置1,导致数字越来越大。正确的写法如下:for (i = 1; i <= n; i++) { ret *= i; sum += ret; }
实例二
为什么会死循环?
int main() { int i = 0; int arr[10] = { 0 }; for (i = 0; i <= 12; i++) { arr[i] = 0; printf("hehe\n"); } return 0; }
有的编译器下,在栈区i和arr是连续的,数组越界访问,访问到了i,造成循环变量i的改变(下图的调试过程可以看出),最终造成死循环。
i和arr是局部变量,存放在栈区。栈区上内存的使用习惯是:先使用高地址处的空间,再使用低处地址的空间,随着数组下标的增长,地址是由低到高变化。使用release版本调试的时候,不会进入死循环。
结语
首先,一定要熟练掌握以上调试技巧。这些都是简单的调试,以后可能会出现很复杂调试场景:多线程程序的调试等。只有基础打得牢,上层建筑才够稳!
其次,多多使用快捷键,提升效率。
最后,初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写程序,但是80%的时间在调试。做好心理准备!
-
C语言位操作
2021-05-20 05:11:09在计算机程序中,数据的位是...C语言提供了位运算的功 能, 这使得C语言也能像汇编语言一样用来编写系统程序。位运算符C语言提供了六种位运算符:& 按位与| 按位或^ 按位异或~ 取反<< 左移>> 右移...在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来 完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。C语言提供了位运算的功 能, 这使得C语言也能像汇编语言一样用来编写系统程序。
位运算符C语言提供了六种位运算符:
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移
1. 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。
例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。
按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为0000000011111111)。
应用:
a. 清零特定位 (mask中特定位置0,其它位为1,s=s&mask)
b. 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask)
2. 按位或运算 按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补 码出现。
例如:9|5可写算式如下:
00001001|00000101
00001101 (十进制为13)可见9|5=13
应用:
常用来将源操作数某些位置1,其它位不变。 (mask中特定位置1,其它位为0 s=s|mask)
3. 按位异或运算 按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如 9^5可写成算式如下:
00001001^00000101 00001100 (十进制为12)
应用:
a. 使特定位的值取反 (mask中特定位置1,其它位为0 s=s^mask)
b. 不引入第三变量,交换两个变量的值 (设 a=a1,b=b1)
目 标 操 作 操作后状态
a=a1^b1 a=a^b a=a1^b1,b=b1
b=a1^b1^b1 b=a^b a=a1^b1,b=a1
a=b1^a1^a1 a=a^b a=b1,b=a1
4. 求反运算 求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。例如~9的运算为: ~(0000000000001001)结果为:1111111111110110
5. 左移运算 左移运算符“<
6. 右移运算 右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。其值相当于除2。
例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。对于左边移出的空位,如果是正数则空位补0,若为负数, 可能补0或补1,这取决于所用的计算机系统。移入0的叫逻辑右移,移入1的叫算术右移,Turbo C采用逻辑右移。
main(){
unsigned a,b;
printf("input a number: ");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d b=%d ",a,b);
}
再看一例:
main(){
char a='a',b='b';
int p,c,d;
p=a;
p=(p<<8)|b;
d=p&0xff;
c=(p&0xff00)>>8;
printf("a=%d b=%d c=%d d=%d ",a,b,c,d);
}
浮点数的存储格式:
浮点数的存储格式是符号+阶码(定点整数)+尾数(定点小数)
SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM
即1位符号位(0为正,1为负),8位指数位,23位尾数位
浮点数存储前先转化成2的k次方形式,即:
f = A1*2^k + A2*2^(k-1) + ... + Ak +... +An*2^(-m) (Ai = {0, 1}, A1 = 1)
如5.5=2^2 + 2^0 + 2^(-1)
其中的k就是指数,加127后组成8位指数位
5.5的指数位就是2+127 = 129 = 10000001
A2A3.....An就是尾数位,不足23位后补0
所以5.5 = 01000000101000000000000000000000 = 40A00000
所以,对浮点数*2、/2只要对8位符号位+、- 即可,但不是左移、右移
关于unsigned int 和 int 的在位运算上的不同,下面有个CU上的例子描述的很清楚:
[问题]:这个函数有什么问题吗?
/
/**
* 本函数将两个16比特位的值连结成为一个32比特位的值。
* 参数:sHighBits 高16位
* sLowBits 低16位
* 返回:32位值
**/
long CatenateBits16(short sHighBits, short sLowBits)
{
long lResult = 0; /* 32位值的临时变量*/
/* 将第一个16位值放入32位值的高16位 */
lResult = sHighBits;
lResult <<= 16;
/* 清除32位值的低16位 */
lResult &= 0xFFFF0000;
/* 将第二个16位值放入32位值的低16位 */
lResult |= (long)sLowBits;
return lResult;
}
/
[问题的发现]:
我们先看如下测试代码:
/
int main()
{
short sHighBits1 = 0x7fff;
short sHighBits2 = 0x8f12;
unsigned short usHighBits3 = 0xff12;
short sLowBits1 = 0x7bcd;
long lResult = 0;
printf("[sHighBits1 + sLowBits1] ";
lResult = CatenateBits16(sHighBits1, sLowBits1);
printf("lResult = %08x ", lResult, lResult);
lResult = CatenateBits16(sHighBits2, sLowBits1);
printf("lResult = %08x ", lResult, lResult);
lResult = CatenateBits16(usHighBits3, sLowBits1);
printf("lResult = %08x ", lResult, lResult);
}
/
运行结果为:
[sHighBits1 + sLowBits1]
lResult = 7fff7bcd
lResult = 8f127bcd
lResult = ff127bcd
嗯,运行很正确嘛……于是我们就放心的在自己的程序中使用起这个函数来了。
可是忽然有一天,我们的一个程序无论如何结果都不对!经过n个小时的检查和调试,最后终于追踪到……CatenateBits16() !?它的返回值居然是错的!!
“郁闷!”你说,“这个函数怎么会有问题呢!?”
可是,更郁闷的还在后头呢,因为你把程序中的输入量作为参数,在一个简单的main()里面单步调试:
/
int main()
{
short sHighBits1 = 0x7FFF;
short sHighBits2 = 0x8F12;
unsigned short usHighBits3 = 0x8F12;
short sLowBits1 = 0x7BCD; //你实际使用的参数
short sLowBits2 = 0x8BCD; //你实际使用的参数
long lResult = 0;
printf("[sHighBits1 + sLowBits1] ";
lResult = CatenateBits16(sHighBits1, sLowBits1);
printf("lResult = %08x ", lResult, lResult);
lResult = CatenateBits16(sHighBits2, sLowBits1);
printf("lResult = %08x ", lResult, lResult);
lResult = CatenateBits16(usHighBits3, sLowBits1);
printf("lResult = %08x ", lResult, lResult);
printf(" [sHighBits1 + sLowBits2] ";
lResult = CatenateBits16(sHighBits1, sLowBits2);
printf("lResult = %08x ", lResult, lResult);
lResult = CatenateBits16(sHighBits2, sLowBits2);
printf("lResult = %08x ", lResult, lResult);
lResult = CatenateBits16(usHighBits3, sLowBits2);
printf("lResult = %08x ", lResult, lResult);
return 0;
}
/
发现结果竟然是:
[sHighBits1 + sLowBits1]
lResult = 7fff7bcd
lResult = 8f127bcd
lResult = 8f127bcd
[sHighBits1 + sLowBits2]
lResult = ffff8bcd //oops!
lResult = ffff8bcd //oops!
lResult = ffff8bcd //oops!
前一次还好好的,后一次就ffff了?X档案?
[X档案的真相]:
注意那两个我们用来当作低16位值的sLowBits1和sLowBits2。
已知:
使用 sLowBits1 = 0x7bcd 时,函数返回正确的值;
使用 sLowBits2 = 0x8bcd 时,函数中发生X档案。
那么,sLowBits1与sLowBits2有什么区别?
注意了,sLowBits1和sLowBits2都是short型(而不是unsigned short),所以在这里,sLowBits1代表一个正数值,而sLowBits2却代表了一个负数值(因为8即是二进制1000,sLowBits2 最高位是1)。
再看CatenateBits16()函数:
/
long CatenateBits16(short sHighBits, short sLowBits)
{
long lResult = 0; /* 32位值的临时变量*/
/* 将第一个16位值放入32位值的高16位 */
lResult = sHighBits;
lResult <<= 16;
/* 清除32位值的低16位 */
lResult &= 0xFFFF0000;
/* 将第二个16位值放入32位值的低16位 */
lResult |= (long)sLowBits; //注意这一句!!!!
return lResult;
}
/
如果我们在函数中用
printf("sLowBits = %04x ", sLowBits);
打印传入的sLowBits值,会发现
sLowBits = 0x7bcd 时,打印结果为
sLowBits = 7bcd
而sLowBits = 0x8bcd时,打印结果为
sLowBits = ffff8bcd
是的,即使用%04x也打印出8位十六进制。
因此,我们看出来了:
当sLowBits = 0x8bcd时,函数中 "lResult |= (long)sLowBits;" 这一句执行,会先将sLowBits转换为
0xffff8bcd
再与lResult做或运算。由于现在lResult的值为 0xXXXX0000 (其中XXXX是任何值),所以显然,无论sHighBits是什么值,最后结果都会是
0xffff8bcd
而当sLowBits = 0x7bcd时,函数中 "lResult |= (long)sLowBits;" 这一句执行,会先将sLowBits转换为
0x00007bcd
再与lResult做或运算。这样做或运算出来的结果当然就是对的。
也就是说,CatenateBits16()在sLowBits的最高位为0的时候表现正常,而在最高位为1的时候出现偏差。
[教训:在某些情况下作位运算和位处理的时候,考虑使用无符号数值——因为这个时候往往不需要处理符号。即使你需要的有符号的数值,那么也应该考虑 自行在调用CatenateBits16()前后做转换——毕竟在位处理中,有符号数值相当诡异!]
下面这个CatenateBits16()版本应该会好一些:
/
unsigned long CatenateBits16(unsigned short sHighBits, unsigned short sLowBits)
{
long lResult = 0;
/* 将第一个16位值放入32位值的高16位 */
lResult = sHighBits;
lResult <<= 16;
/* 清除32位值的低16位 */
lResult &= 0xFFFF0000;
/* 将第二个16位值放入32位值的低16位 */
lResult |= (long)sLowBits & 0x0000FFFF;
return lResult;
}
/
注意其中的 "lResult |= (long)sLowBits & 0x0000FFFF;"。事实上,现在即使我们把CatenateBits16()函数的参数(特别是sLowBits)声明为short,结果也会是 对的。
-
C语言程序设计上机指导书及答案
2021-05-19 11:53:541、姓 名:学 号:专 业:日 期:指导原则:促进学生针对实际问题,用所学 C语言知识编写符合规范的源程序代码,在某一集成 开发环境下尽一切调试技能调试程序,并对运行结果进行分析处理, 得出正确结论,解决好...《C语言程序设计上机指导书及答案》由会员分享,可在线阅读,更多相关《C语言程序设计上机指导书及答案(36页珍藏版)》请在人人文库网上搜索。
1、姓 名:学 号:专 业:日 期:指导原则:促进学生针对实际问题,用所学 C语言知识编写符合规范的源程序代码,在某一集成 开发环境下尽一切调试技能调试程序,并对运行结果进行分析处理, 得出正确结论,解决好实际问题。更快更好地掌握所学知识,技能和软件的一向开发方法 目的:1,通过上机实验,加深对教材内容的理解,特别是一些语法规定,熟练掌握各种 语法规则。2,通过上机实验,熟悉某个C语言集成开发环境。掌握集成开发环境下程序的编辑、编译与连接、运行的完整过程3,通过上机实验,要学会调试程序。能根据系统给出的“出错信息”,判断错误所在,并修改错误,使程序正确运行。要求:1,复习与本次实验相关的教学内容2。
2、,了解集成开发环境的操作步骤3,准备好实验内容。对于编程题,一定要自己动手,书写工整,并人工检查无误后 才能上机实验,以提高上机效率。4,要准备好调试和运行程序时所需的数据。5,对运行中可能出现的问题事先作出估计,并对程序中有疑问的地方作上标记,以 便在运行时给予注意。并在程序调试时,把系统给出的出错原因,解决方法等记 载在源程序之后;程序运行结束后,把运行结果也记录下来。6,每个实验应独立完成,对实际问题所编写的源程序需写出完整实验的报告。第一次上机作业熟悉C语言集成开发环境实验目的:1, 熟悉C语言集成开发环境2,掌握集成开发环境下文件的编写与调用,源程序的编译与调试,程序运行结果的观察与。
3、分析。3, 掌握C语言程序的基本结构实验要求:1, 程序编写完后,要对输入的每一个符号和词进行检查核对,不能有错。2,编写源程序时,不要在中文输入法下进行,也不要有首字符大写,否则调试时,会 有错误。实验内容:1,在D盘新建文件夹:D : C语言程序 XXX(所在班级如0709401) XXX(自己学号或姓名如01),作为以后所做程序的存放位置。注:每次换机器须重复此操作。2, 编辑,编译,运行下面程序并存盘,文件名为ex1_1.c /*输出信息的C源程序,文件名为 ex1_1.c */#i nclude stdio.h ”void mai n() printf( Hello, Everyon。
4、e n Study hard!n );输出结果为 Hello, Every oneStudy hard!3, 调入文件ex1_1.c,把程序修改成下面形式,运行,存盘,文件名为ex1_2.c/*输出信息的C源程序,文件名为ex1_2.c */#i nclude stdio.h void mai n() printf( Hello, Every one n ); printf( “Study hard!n ”输出结果为 Hello, Every oneStudy hard ,”n ”的作用是 换行4,编辑,编译,运行下面程序并存盘,文件名为ex1_3.c/*计算圆面积的程序,文件名为ex1_3.。
5、c */#i nclude stdio.h void mai n() float r,area;printf( r=?);scanf( %f ”&r);area=3.1415926*r*r;printf( arear=%fn ,area);area=3.141593area=314.159260第一次运行时输入1,运行结果为 再次运行时输入10,运行结果为把语句 printf( arear=%fn”,area);修改为:printf( arear(%0.1f)=%fn,r,area);后,运行时输入10,这时程序的运行结果为area (10.0) =314.159260操作步骤:一,Turbo。
6、C 2.0集成开发环境(1)熟悉C语言集成开发环境进入集成开发环境(菜单模式):执行文件TC.EXE文件菜单(file ): FILE中有:NEW (新建文件),LOAD (或OPEN打开或调 入文件),SAVE (保存文件),SAVE AS , QUIT (退出 C 语言集成开发环境)编译菜单(compile) :COMPILE TO OBJ + (路径名 文件名)运行菜单(run):RUN , USER SCREEN选项(option ):DIRECTORY (注明TC。EXE的当前目录路径,路径不符合,编译程序找不到库函数所在头文件,编译会出错)从菜单进入编辑区的按键:En ter从编辑。
7、区进入菜单的按键:F10注:运行出错时,按 F10也可回到菜单区,按EDIT 进入编辑区(2)掌握 C 语言源程序的编写 (new (FILE),编译(compile to obj (COMPILE), 运行(run (RUN),观察结果(user screen (RUN)四个步骤。编译出错时,按 ENTER键,然后在光标所在行或上一行查找出错位置。同时 在顶行红字部分(英文提示)找出错原因。(3)掌握一定的调试方法。方法:在已编译好的程序中人为制造错误(如删除标点符号,改错保留字(int,二,Visual C+6.0集成开发环境1,printf, scanf),确定出错位置(光标所在行),猜。
8、测出错原因(根据顶行英文提 示)。启动Visual C+ 6.0环境方法:单击 开始”程序” “Microsoft Visual studio 6.0 - “ Microsoft Visual C+ 6.0 命令,启动 Visual C+ , VC6主窗口如下:菜单栏工具栏标题栏输出区状态栏2.编辑源程序文件(1 )建立新工程项目 单击 文件”-新建”弹出 新建”对话框。41更改4 2打幵文件 文件位彗夹浏兇窗口仃单击工程2,苴击3箍入內 口32 C nwle Asp ication :程名 单击工程”选项卡;单击Win32 Con sole Applicatio n ”选项;工程文件”框中输。
9、 入项目名(如gc1);位置”框输入文件保存文件夹或单击“”打开文件夹浏览窗口,选择新项目文件所需保存的位置,单击确定”按钮。 弹出 Win32 Con sole Application Step 1of 1 对话框,在对话框中单击An empt project ”按钮和 完成”按钮。系统显示新建工程信息”对话框。单击 确定”按钮。(2)建立新项目中的文件 单击 文件”新建”,弹出 新建”对话框。3输入 文伤名1*单击“文件2,单击弋+-BoureeFiU 选顶 选择 文件”选项卡。单击 C+ Source File ”选项,在 文件”文件框中输入文件名, 单击 确定”按钮。系统自动返回 VC。
10、6主窗口。 显示文件编辑区窗口,在文件编辑区窗口输入源程序文件。3 ,编译和连接方法一:选择主窗口菜单栏中“编译”菜单项;系统弹出下拉菜单,选择“构件”菜单命令。方法二:单击主窗口编译工具栏上的“ Build ”按钮进行编译和连接。注:.exe。(1)系统对程序文件进行编译和连接,生成以项目名称命名的可执行目标代码文件(2 )编译连接过程中,系统如发现程序有语法错误,则在输出区窗口中显示错误信息,给 出错误的性质、出现位置和错误的原因等。如果双击某条错误,编辑区窗口右侧出现 一个箭头,指示再现错误的程序行。用户据此对源程序进行相应的修改,并重新编译 和连接,直到通过为止。4. 执行方法一:单击。
11、“编译”菜单中“执行”命令。方法二:单击主窗口编译工具栏上的“ Build Execute ”按钮来执行编译连接后的程序运行成功,屏幕上输出执行结果,并提示信息:“Press any key to contin ue。此时按任意键系统都将返回VC6主窗口。注:在执行程序过程中出现运行错误。用户要修改源程序文件并且重新编译、连接和执行。第二次上机作业掌握基本数据类型在程序中的正确应用实验目的:1熟悉C语言集成开发环境及程序编写、编译、运行,观察运行结果2掌握基本的调试技巧(缺少标点符号,函数名错误或不一致)3 熟悉 C 语言基本数据类型(int, lo ng,un sig ned int,flo。
12、at,double, char)的输 入,输出格式(%d,%ld,%f,%lf,%c, %o,%x,%u)实验内容:1,输入半径,求圆的面积(要求圆周率用符号常量表示)(查错改错1:圆周率的定义名与使用名不一致;查错改错2:面积的输出格式用 %d )。作业1程序如下,调试改正两处错误 ,正确运行后将文件保存为 ex2_1.c#define pi 3.1415927#in cludestdio.hmain () floatarea,banj ing;prin tf(please en ter a datan);scan f(%f, &banji ng);area=p*banjing*banjin。
13、g;/*圆周率的定义名pi与使用名 p不一致*/printf(n the area of yuan is %dn,area);/* 面积的输出格式 %d 改为 %f */A)调试,语法错误如下:出错信息为:D:vcfileex1ex.cpp(7) : error C2065: p : undeclared identifier 中文意思为:符号 p没有定义。错误原因及更正:圆周率的定义名pi与使用名p不一致,改为pi运行B)观察及分析运行结果,逻辑错误叭 *D: kvcfileezlDel)iig Veil. eethe a pea uF i/iian zls 976311.353Press 。
14、any key to continue分析:半径为3时,圆的面积应为:pi X 3 X 3 = 28.2743343,不能为负数。 查错:先查面积变量 area的输出格式,再往上逆推查其运算方法,最后查其定义 错误原因及更正:面积的输出格式%d (整数)改为%f (实数或单精度浮点数)2,调入ex2_1.c另存为ex2_2.c,并做如下修改后,保存调试运行程序,观察系统出出错信息(英文),并翻译成中文。注:每改一次,就调试一次。1) 将语句:float area, banjing; 改为:floatarea, banjing ;则出错信息为:F:C 语言作业 1.cpp(4) : error 。
15、C2065: floatarea : undeclaredide ntifierF:C 语言作业 1.cpp(4) : error C2065: baniing : undeclared identifierF:C 语言作业 1.cpp(7) : error C2065: area : undeclared identifier中文意思为:文件的第四行有错,符号floatarea没有定义错误原因及更正:floatarea中float 与 area之间少了空格,加上空格2) 将语句:printf (”n ”);改为:printf (”n ”)则出错信息为:F:C 语言作业 1.cpp(6) : 。
16、error C2146: syntax error : missing ;before identifier scanf中文意思为:文件的第六行有错错误原因及更正:少了“;”,在第六行后加上“;”3) 将语句:scanf(“ f” ,&banjing);为:scan( “ f” ,&banjing);则出错信息为:F:C 语言作业 1.cpp(6) : error C2065: scan : undeclared identifier中文意思为:文件第六行sca n没有定义错误原因及更正:scan后少了 仁加上f4) 将语句:float area, banjing ;中英文标点符号;”或,”,。
17、改为中文输入法 全角字符后,再输入同样标点则出错信息为:F:C 语言作业 1.cpp(4) : error C2018: unknown character0xa3F:C 语言作业 1.cpp(4) : error C2018: unknown characterOxacF:C 语言作业 1.cpp(5) : error C2146: syntax error : missing ; before identifier pri ntf中文意思为:系统不能识别字符“,” 错误原因及更正:将“,”改为英文输入法输出的“,”第三次上机作业运算符与表达式的使用实验目的:1,熟悉C语言集成开发环境和熟悉。
18、C语言程序结构2,掌握一定的调试技巧。3,熟悉运算符与表达式的正确使用。 作业内容要求:1,程序填空,以下程序输入3个整数值 给a,b,c,程序把b中的值给a,把c中的值给b,把a中的值给c,交换后输出a,b,c的值,例如输入123,输出a=2,b=3,c=1#in cludestdio.hvoid mai n() int a,b,c, t】prin tf(e nter a,b,c:);scanf(%d%d%d,&a,&b,&c); /* 输入 a,b,c 的值 */t=a;a=b:/*把b中的值给 a,*/b=c;c=t:/*把a的原来值给c*/prin tf(a=%d b=%d c=%dn。
19、,a,b,c); */1, 填空后,运行程序,结果如下:en ter a, b,c:1 2 3a=2,b=3,c=12, 在程序输出语句前插入语句: clrscr();根据运行结果,说明其作用 TC下清屏命令在程序输出语句后插入语句:getchar();根据运行结果,说明其作用_等待键盘输入字符2,调试以下程序(划横线处有错),写出运行结果并简要回答为什么(即了解程序的 运行过程)#in clude stdio.h”main ()intx,y,z;x=6;y=100;z=(+x)/(y-);printf( x=%d,y=%d,z=%dn ”,x,y,z);z=(x+y)*(x+)printf(。
20、 X=%d,y=%d,z=%dn ,x,y,z);运行结果:x=7,y=99,z=0x=8,y=98,z=742第四次上机作业掌握顺序结构程序设计实验目的:4,熟悉C语言集成开发环境和熟悉C语言程序结构5,掌握一定的调试技巧。6,熟悉运算符与表达式的正确使用。7,掌握语句的正确书写,学会编写顺序结构的程序。作业内容要求:1,编写程序求解:已知半径r=3厘米(cm).求球的体积v;源程序代码上机调试后,源程序中需修改的对应部分#in cludestdio.h#defi ne pi 3.1415926void mai n()Lfloat a,b,r=3:double v:a=4.0;b=3.0:v。
21、=(a/b)*pi*r*r*r:prin tf(v=%fn,v);程序运行结果:v=113.0973342,以下叁个程序,选一个做。1) 输入两个整数,求其和,差,积,商和余数2) 输入一个三位数,依次输出其个位数字,十位数字,百位数字。13) 用公式 s a (s b)(s c)求三角形的面积(其中 s a b c ,a,b,c为三角形的三边长)要求:1,确定所需的输入变量,输出变量,中间变量的个数及命名,并为其选取正确 的数据类型。2,根据正确的逻辑顺序书写程序。(变量先说明再赋值后使用;先输入再处理后输出;3,每次输出必须有提示信息。如:printf( n x+y=%f ,x+y); 其。
22、中:x+y= 是提示信息。题号:第3题源程序代码:# include #in elude void mai n()Jfloat a,b,c:double area;sea nf(%f%f%f&a,&b,&c);if(a=b+c II b=a+c II c=a+b|a源程序中需修改的对应部分#in clude #in elude #in elude main () int a,b,c;float s,are; double s,area;a=3,b=4,c=5;程序:用公式求三角形面积:.(s a)(s b)(s c)s,s=(a b c)printf( enter three datasn”;。
23、scanf( %d%d%d,a,b,c);scanf(%d%d%d,&a,&b,&c);s=1/2*(a+b+c);area=sqrt(s a)*(s b)*(s c)*s;s=1.0/2*(a+b+c);area=sqrt(s-a)*(s-b)*(s-c)*s);printf( a=%d,b=%d,c=%dnarea=%d ”a,b,c,area); area=%f12, 编程求三角形面积:s 2absinC , (C的单位为度数,库函数中自变量单位为弧 度数)(已知:a=5, b=3, C=30。)注意:1,表达式的正确书写格式,2,程序的设计方法,3,检查、核实程序的顺序的正确性代码:#。
24、defi ne pi 3.1415927#i nclude #in elude void mai n() int a,b;double c,s;a=5,b=3;c=(1.0/180)*pi*30: s=(1.0/2)*a*b*si n(c);prin tf(s=%lfn,s):k运行结果:s=3.750000第六次上机作业分支结构程序实验目的:1,熟悉输入输出格式的使用2,掌握逻辑运算符的特殊运算规则3,了解简单的分支结构程序设计4,学会阅读程序的基本技巧(参考第七讲:分析程序运行过程) 上机内容:1,阅读下面程序,计算运行结果,然后上机验证。#i nclude void mai n() in。
25、t c,d,e; double a,b,t; a=3.6,b=-3.2;if(ab)t=a; a=b;b=t;/* 思考该复合语句的功能 */printf( n%5.2f,%5.2f ”a,b)c=1,d=1;e=-c&d-;/*注意运算符的优先级和运算规则*/printf( nc=%d,d=%d,e=%d ”c,d,e);e=+d|c+;pirntf( nc=%d,d=%d,e%d ”,c,d,e);运行结果:-3.20, 3.60c=0,d =1,e=0c=0,d=2,e=02,程序填空,输入x值,计算下面的函数值,并输出结果xx 1y2x 11x 103x 11x 10程序如下:#i n。
26、cludestdio.hvoid mai n() double x,y;scan f(%lf, &x):I/x类型与输入格式if(x0,b0,c0):n);sca nf(%d%d%d,&a,&b, &c);if(a+bc)&(a+cb )&(b+ca)任意两边之和大于第三边s=1.0/2*(a+b+c);area=sqrt(s*(s_a)*(s_b)*(s_c);printf(area=%6.2fn,area):/ 输岀面积elseprin tf(nthree data a,b,c cant form a tria nglen);运行结果:en ter three positive nu mb。
27、ers a b c(a0,b0,c0):3 4 5area= 6.002,编程求一元二次方程 ax2+bx+c=0的根根据不同的系数 a,b,c有以下的几种情况:21, a 0,b -4ac0时,方程有两不等实根 x1,x222, a0,b -4ac=0时,方程有两相等实根x1 = x223, a0,b -4ac# include float a ,b,c,disc,x1,x2,y1,y2;prin tf(please en ter:a,b,c n);sea nf(%f,%f,%f, &a,&b,&c):disc=b*b-4*a*c;if(a=0)if (b=0)if (c=0) prin t。
28、f(the quadratic equatio n has many roots n); else prin tf(the quadratic equati on has no root n);elseLx1=x2=-c/b;prin tf(x 仁x2=%.2fn,x1);Lelseif(disc=0)x1=(-b+sqrt(disc)/(2*a);x2=(b sqrt(disc)/(2*a);prin tf(the roots of the quadratic equati on: x1=%.2f,x2=%.2fn,x1,x2):elsex仁 x2=-b/(2*a);y1=y2=sqrt(a。
29、bs(disc)/(2*a);prin tf(the roots of the quadratic equati on: x1=%.2f+%.2fi,x2=%.2f-%.2fin,x1,y1,x2,y2): 丄动态测试:数据准备,根据前面分析,应准备 6组数据第一组数据:a=1,b=2,c=-3运行结果:the roots of the quadratic equation:x1=1.00,x2=-3.00第二组数据:a=1,b=2,c=1运行结果:the roots of the quadratic equati on: x1=-1.00,x2=-1.00第三组数据:a=1,b=2,c=2运。
30、行结果:the roots of the quadratic equati on: x1=-1.00+1.00i,x2=-1.00-1.00i第四组数据:a=0,b=2,c=3运行结果:the roots of the quadratic equati on: x1=x2=-1.5第五组数据:a=0,b=0,c=1运行结果:the quadratic equati on has no any root第六组数据:a=b=c=0运行结果:the quadratic equatio n has many roots第八次上机作业循环结构程序设计(一) 实验目的:1, 掌握程序的基本设计方法(能分析。
31、具体问题的算法,输入输出,流程)2, 掌握while循环的语义、语法和它的使用。(能根据流程写程序,根据程序写流程)3, 能正确阅读程序,根据问题说明把程序补充完整上机内容:1,填空,使程序完整问题说明:输出所有水仙花数。(水仙花数是三位自然数,其各位数字的立方和等于该数,例:153= 13 53 33 )程序:#i ncludestdio.hmain ()int l,x,y, z;/变量或函数说明1=100;while(l# includefloat h1,h2; h1=50.0;int n;n=1;while( nvoid mai n() int n1,n2,n3;double s1=0,。
32、s2=0,s3=1;for(n 1=1; n1void mai n() int I,j,sum=0;for(l=101;l=l)sum+=l; /素数条件:jvoid mai n()_Lint a,n ,i=1,s n=0,t n=0;prin tf(a ,n=:);sea nf(%d,%d, &a,&n):while (i#defi ne N 20void mai n()int l,aN,bN; /定义两个数组float s;a0=2; / 数纟组元素初始化b0=1:for(I=1;I#defi ne N 8void mai n() int i,aN=1,2,34567,8;int k,te。
33、mp;for(i=0:ivoid mai n() int a8=23,145,65,73,12,74,91,5;int i.j.temp.k:for (i=0;iai)Ltemp=ai;ai=aj;aj=temp:亠for(k=0;kb?x:b; x=xc?x:c;return x;第十五次上机作业 函数(二)实验目的:1,能正确理解和阅读带自定义函数的程序。2,进一步熟练掌握自定义函数的定义、说明和调用。3,能熟练使用定义函数编程上机内容:1,程序填空:说明:求一个数组中各元素的最大元并输出。程序:#include sfdio.h”#define N 6main () int aN,l,ma。
34、x;int maxvalue(int a,i nt m);for(l=0;lmax)max=ak;return max;程序运行结果输入3 2 8769max of the aN is 92,用自定义函数编程:输入三角形的三边的边长,求其面积。面积计算公式:sqrt(p(p-a)(p-b)(p-c) , p为周长的一半。主函数应包含输入无效数据的情况(即 a,b,c不能构成三角形的三边或它们有 个负数)。源程序代码:#includestdio h#in cludemath.hfloat area(float a,float b,float c)float p=(a+b+c)/2;float a。
35、rea;area=(float)sqrt(p*(p-a)*(p-b)*(p-c);return area:Lvoid mai n()Lfloat a,b,c;prin tf(type in a,b,c n);scan f(%f,%f,%f,&a,&b, &c);if(a+bc&a+cb&b+ca)prin tf(area=%0.2fn,area(a,b,c);else prin tf(error!n);k运行结果:type in a,b,c3,4,5area=6.00第十六次上机作业 函数(三)和预处理实验目的:1, 能熟练使用定义函数编程,理解函数的参数传递过程。2, 能正确阅读带宏定义的程。
36、序,掌握宏定义的正确替换。3,掌握宏定义和带参数宏定义的简单使用。上机内容:1, 阅读程序,写出程序运行结果并分析原因:程序1:#include sfdio.h”#define P0W1(x) x*x#define P0W2(x)(x)*(x)main () int x=7,y=8;printf( pow 1=%din ”,P0W1(x+y);printf( pow2=%dn ”,P0W2(x+y);运行结果:pow1=71pow2=2252, 程序填空:问题说明:利用下列公式求圆周率n的近似值,借助宏定义修改n值,试计算n的若干近似值。如 N= 10 或 N= 50 或 N= 100) 程序:#i ncludestdio.h#i nclude / 数学库函数#define N 100main () long k;double pi=0.0;for(k=1;k=N;k+)pi+=1.O/(k*k); /累加求和pi=sqrt(6.0*pi); /由公式求圆周率prin tf(PI=%12.8fn ”,pi);运行结果:Pl= 3.132076533,编程:主函数输入自然数 n,然后调用函数 n atural(),最后输出该函数返回之值。函数输 出该函数返回之值。函数 natural(n)计算下列自然数平。
-
c语言执行命令快捷键是什么??
2021-05-23 12:12:41CTRL + SHIFT + E 显示资源视图 F12 转到定义 CTRL + F12 转到声明 CTRL + ALT + J 对象浏览 CTRL + ALT + F1 帮助目录 CTRL + F1 动态帮助 F1 帮助 SHIFT + F1 当前窗口帮助 CTRL + ALT + F3 帮助-搜索 SHIFT + ALT... -
c语言中的快捷键有哪些?
2021-05-25 06:02:292012-05-17 回答不知道您使用的是什么开发工具,如果是visual stdio的话ctrl + shift + b生成解决方案ctrl + f7生成编译ctrl + o打开文件...f4显示项目属性窗口ctrl + shift + e显示资源视图f12转到定义ctrl + f12... -
VS中F12后怎么快速返回
2021-11-09 15:47:44方法1:Ctrl + Tab 方法2:Ctrl + Shift + 8 -
【c语言入门软件】dev新建工程、运行和调试
2018-10-19 10:36:26dev新建工程、运行和调试 上一次安装中,曾让你们把安装路径记下来,现在我们可以找到安装路径,拷贝出里面的help文件夹,打开到这里,我们将比较官方的形式来了解以下dev的使用。 1.Editing 在编辑之前,我们需要... -
VS2019调试时快捷键不起作用,可以这样解决
2022-02-25 10:10:59使用VS2019时,运行调试需要按Fn+F5,但是快捷键没有反应,这是按着Fn+Ctrl +F~ 就有效果 这时候按下Fn+Esc,然后就可以直接按下F1-F12使用VS的快捷键了。 使用完毕,按下Fn+Esc,又变回了系统的快捷键。 ... -
安卓逆向-C语言简单普及 | IDA静态调试
2021-03-10 14:16:50C语言简单普及 //整型 int a = 100; //字符串 char *s = "yuanrenxue.com"; //浮点型 float = "3.14"; //双精度浮点型 double = "3.141592633764862"; //指针 int *a_add = &a; //字符串常量 不能修改... -
C++学习1-(C语言基础、VS快捷键)
2021-05-22 07:07:10C语言基础复习1、三码正数:3码合1 ,正数的反码/补码就是其本身负数:原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值原码:11010101负数的反码是在其原码的基础上, 符号位不变,其余各个位取反... -
C语言位运算
2021-05-25 08:41:30在计算机程序中,数据的位是...C语言提供了位运算的功能, 这使得C语言也能像汇编语言一样用来编写系统程序。位运算符C语言提供了六种位运算符:& 按位与| 按位或^ 按位异或~ 取反<< 左移>> 右移1.... -
2021-09-30:零基础学c语言第二天--调试
2021-09-30 01:52:38说来惭愧。今天在q群看一位同学的代码。等我翻来覆去debug一个小时之后,告诉他问题和...f12:转到定义 f11:逐语句 f10:逐过程 f9:设置断点 ctrl+f9:启用/停止断点 f5:调试 另外电脑有fn锁定,用fn+esc才能 -
使用chrome的F12开发人员工具进行网页前端性能测试
2021-06-13 05:26:20centos7 使用kubeadm 快速部署 kubernetes 国内源 前言 搭建kubernetes时看文档以及资料走了很多弯路,so 整理了最后成功安装的过程已做记录.网上的搭建文章总是少一些步骤,想本人这样的小白总是部署不成功(^_^). ... -
C语言中的位运算
2021-05-25 08:41:28在计算机程序中,数据的位是...C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。位运算符C语言提供了六种位运算符:& 按位与| 按位或^ 按位异或~ 取反<< 左移>> 右移1. ... -
嵌入式 C语言 补充
2021-10-01 17:02:48文章目录前言C语言结构体中__packed 和位段的理解1、__packed对齐2、位段共用体 union作用:举个例子assert()assert() 的用法和机制NDEBUG 宏C typedef为基本数据类型定义新的类型名为自定义数据类型(结构体、共用... -
初始C语言前4/13
2021-11-08 17:15:15什么是C语言 目录 什么是C语言 1 第一个C语言程序 2 数据类型 3 变量、常量 4 字符串+转义字符+注释 1第一个C语言程序 2数据类型 3变量、常量 4字符串+转义字符+注释 -
C语言的编译和运行按什么键
2021-05-22 15:25:49CTRL + SHIFT + E 显示资源视图 F12 转到定义 CTRL + F12 转到声明 CTRL + ALT + J 对象浏览 CTRL + ALT + F1 帮助目录 CTRL + F1 动态帮助 F1 帮助 SHIFT + F1 当前窗口帮助 CTRL + ALT + F3 帮助-搜索 SHIFT + ALT... -
bochs虚拟机调试命令大全
2022-01-25 14:17:39操作系统开发必备工具bochs调试命令大全 -
C语言函数调用分析
2021-05-21 05:40:37今天突发奇想想要研究一下C语言的函数调用.因为以前有个课程设计涉及到C语言函数返回地址的问题,今天看Thinking in C++的时候,看到类似的东西...就想要验证一下.编译器:gcc4.0.1 on darwin操作系统:Mac OS X 10.5.8... -
Clion使用笔记(C语言、C++、stm32)
2022-01-20 14:55:13Clion使用笔记(C语言、C++、stm32) -
C语言连接mysql数据库
2021-01-18 18:11:21操作系统:win7/64编译软件:VS2010数据库:5.7.11从C语言连接mysql数据库包含两个步骤:1 初始化连接句柄结构2 实际创建连接测试代码1:#include "stdafx.h"#include /*socket通信,系统头文件*/#include#include#... -
Dev-cpp调试教程
2021-10-29 19:37:07鉴于同学们在入门C/C++语言编程时,对一些代码的逻辑还不太熟悉,难以发现代码的BUG,如果能掌握一些基本的调试方法就可以如虎添翼,更好地找到程序的漏洞,我在这里写一份Dev-cppIDE的入门调试教程,如有不足请指教... -
VS2019的常见错误和调试功能
2021-09-12 15:28:55二、VS2019的调试功能(不打断点) 三、VS2019的调试功能(打断点) 四、总结 一、VS2019常见问题 1、scanf问题 很多小伙伴在使用VS2019的时候写了一个带有scanf语句的很简单的代码,然而编译器却给... -
C语言中各位运算的作用(与、或、异或等)
2021-05-18 11:58:10只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1... -
c语言总结
2019-07-17 13:31:04stdio.h —— c语言库函数 函数体 —— 执行代码 ‘ \ ’ —— 转义字符 printf("字符串“); return —— 函数的结束,返回值可以通过其带回;返回值为0代表程序正常结束 注释(块注释不能嵌套使用) 快捷键... -
Android逆向之旅---应用的"反调试"方案解析(附加修改IDA调试端口和修改内核信息)
2020-04-19 12:14:07在前一篇文章中详细介绍了Android现阶段可以采用的几种反调试方案策略,我们在破解逆向应用的时候,一般现在第一步都回去解决反调试,不然后续步骤无法进行,当然如果你是静态分析的话获取就没必要了。但是有时候... -
Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)
2020-04-18 21:28:30今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为了安全或者效率问题,会把一些重要的功能放到native... -
VSCode的远程连接和CMAKE项目调试
2021-07-12 16:03:16文章目录1 需要下载的插件1.1 插件列表1.2 插件离线下载方式2 VS Code远程开发2.1 VS code 远程开发所需插件2.2 远程开发环境配置2.2.1 windows2.2.2 Ubuntu3 CMake大型项目运行和调试3.1 CMakeList.txt构建大型项目...