当前位置:网站首页>C语言知识点精细详解——初识C语言【1】——你不能不知的VS2022调试技巧及代码实操【2】

C语言知识点精细详解——初识C语言【1】——你不能不知的VS2022调试技巧及代码实操【2】

2022-04-23 14:12:00 VelvetShiki_Not_VS

逐过程调试F10与逐语句调试F11的区别,可用如图代码来解释:

#define _CRT_SECURE_NO_WARNINGS 1
#include<string.h>
#include<windows.h>
#include<stdio.h>


void character_output(char* str, size_t size)   //将hello world打印输出函数
{
	int i;
	printf("output in char: ");
	for (i = 0; i < size; i++)
	{
		printf("%c ", str[i]);
	}
}


void buffer_clear(char)       //将scanf输入缓冲区清空
{
	scanf("%*[^\n]"); scanf("%*c");
}


int main()
{
	size_t j;
	char arr[50] = { 0 };              //此处设置断点1
	scanf("%[^\n]", arr);
	buffer_clear('\n');
	j = strlen(arr);
	printf("size is : %zu\n", j);
	character_output(arr, j);          //此处设置断点2
	getchar();
	return 0;
}

①该主函数功能为手动输入hello world并计算该字符串长度,同时for循环输出该字符串。

②对主函数定义arr数组与printf输出字符串长度的两个命令行设置断点,通过F5进入代码调试,启动调试选项卡中的窗口并选中检视窗口即可观察调试过程中参数值的变化:

③断点运行到字符数组arr断点,停止等待命令,此时通过监视器观察数组中未初始化情况下的数组值:

④按下F10,执行该行数组初始化命令,调试指针移动到下一命令行等待;此时在监视器里可以观察到该字符数组已经被数值0初始化:

⑤初始化数组成功再次按下F10,执行到了scanf输入函数,此时控制台会自动跳出让我们输入所需字符串,输入hello world,数组值定义完成,由于之前初始化时自动为全部下标对应值设为了0,所以不需要手动输入字符串结束符\0来界定字符串结束:

可观察到数组前11位已经成功赋值了相应字符,第11位后直至下标49号元素都是0。

数组下标相应的字符内容

⑥再次按下F10,执行清除缓冲区函数buffer_clear,若该函数功能不想调试,可以直接按下逐过程调试快捷键F10,使函数内语句自动运行,即不调试用户自定函数中的内容,直接切到再下一行的指令。

buffer_clear函数因为进行了逐过程调试,所以不进入函数内部,而是直接移动到了下一行

⑥若要快速移动到下一个断点,中间的所有过程默认通过的话,可以再按一下调试快捷键F5,直接切换到了下一个自定函数character_output所在的第28行语句,之前的j值初始化赋值和printf打印数组长度也就顺带执行了。

⑦若该函数内部功能语句有错误,或其重要程度需要逐语句调试查看,可按下F11,调试进入该用户自定函数的域内从括号开始进行逐命令行分析:

 从大括号开始调试

⑧在函数内部的逐过程或逐语句调试与在主函数中的步骤是一致的,以此也证明逐过程F10与逐语句F11只在是否进入子函数上有区别,而在独立的函数中可视为等价操作。

⑧对于for循环而言,参数在满足循环变量的情况下需要执行几次,调试也就随之执行几次,一直到循环条件为假,调试指针出了子函数范围才再回到主函数中继续后续命令的调试。若想提前跳出子函数的调试,可以按下快捷局部跳出函数调试指令Shift F11,该操作可等效为F10的逐过程调试而跳出该子函数,若想使整个调试结束则可按下Shift F5。

总结:

  1. 调试是编辑代码和功能测试的一个重要功能,它不仅能帮忙逐个分析每条语句的语法规范,操作时如何执行的(如数组是如何初始化的,赋值后的数组元素是怎样一个排列),还能在代码出现错误的时候手动逐条分析,寻找bug。
  2. 不管是调试F5还是执行但不调试Ctrl F5,两个操作都默认使我们编辑好的源代码经过编译(成目标文件.obj)并连接成为了可执行程序.exe,所以才可以看到控制台下的数据是如何以程序的形式展现的。
  3. 通过对源文件.c进行上述调试或执行使我们得到了的目标文件和可执行程序文件.exe。相同的目的,不同的操作还有Ctrl F7,可使该同一个工程项目下定义的所有源代码文件(有时源文件不止一个,还有专门定义函数功能被头文件引用的单独函数源文件)同时编译并生成解决方案.sln和可执行程序.exe。若只想对当前一个源代码文件编译仅生成目标文件.obj则可使用F7。
  4. 这里还要区分一个VS编译器底下各文件的概念。由于VS是一个集成式开发软件,它还会帮我们把生成的所有文件汇总成一个项目文件,即解决方案文件.sln,将它可以看作是可被VS编译器识别的可执行程序.exe入口。解决方案文件又是同一个工程项目底下各个工程文件.vcxproj的集合,但是此两种文件都是面向VS编译器识别和调试运行的,与代码本身编译和生成可执行程序无关,所以将.sln或.vcxproj该两个解决方案和工程文件删除也不会对程序本身运行产生任何影响。
  5. 值得注意的是,发布版release的可执行程序文件不能直接将其分享给别人运行使用,因为每个计算机运行环境的不同,还需要整个程序的依赖库,所以如果想要分享程序文件的话,就需要给程序文件打包,即项目程序安装包。

阶段性预热知识,请参考上一篇VS2022调试技巧,连贯阅读体验更加C语言知识点精细详解——初识C语言【1】——你不能不知的VS2022调试技巧及代码实操【1】_VelvetShiki_Not_VS的博客-CSDN博客

精心笔记整理,创作不易。若有疑问请留下评论或私信,如果对你有帮助的话请留下点赞再走吧~

版权声明
本文为[VelvetShiki_Not_VS]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_67611811/article/details/124204362