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

逐过程调试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博客

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

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我来为您解答。 首先,单向链表是一种常用的数据结构,它由多个节点组成,每个节点包含两个部分:数据域和指针域。数据域用于存储数据,指针域指向下一个节点,这样就形成了一个链表。 针对您的需求,可以通过以下步骤来现: 1. 定义节点结构体 定义一个节点结构体,包含数据域和指针域,用于存储链表中的数据。 ```c++ struct Node { int data; // 数据域 Node *next; // 指针域 }; ``` 2. 创建链表 在主函数中,创建一个头结点,并把头结点的指针域置为NULL,表示链表为空。 ```c++ int main() { Node *head = new Node; // 创建头结点 head->next = NULL; // 头结点的指针域置为NULL,表示链表为空 ... } ``` 3. 插入元素 接下来,可以现插入元素的功能。从键盘输入元素的值,创建一个新节点,将新节点插入到链表中。 ```c++ int val; cin >> val; // 从键盘输入元素的值 Node *newNode = new Node; // 创建新节点 newNode->data = val; // 新节点的数据域赋值为val newNode->next = NULL; // 新节点的指针域置为NULL Node *p = head; // 定义指针p指向头结点 while (p->next != NULL) { p = p->next; // 指针p一直向后移动,直到找到链表尾部 } p->next = newNode; // 将新节点插入到链表尾部 ``` 4. 删除元素 要删除链表中的元素,需要先找到要删除的节点,然后将该节点的前一个节点的指针域指向该节点的下一个节点。 ```c++ int val; cin >> val; // 从键盘输入要删除的元素的值 Node *p = head; // 定义指针p指向头结点 while (p->next != NULL && p->next->data != val) { p = p->next; // 指针p一直向后移动,直到找到要删除的节点的前一个节点 } if (p->next != NULL) { // 如果找到了要删除的节点 Node *q = p->next; // 定义指针q指向要删除的节点 p->next = q->next; // 将要删除的节点从链表中删除 delete q; // 释放内存 } ``` 5. 按值查找元素 要按值查找链表中的元素,需要遍历链表,找到第一个数据域等于给定值的节点。 ```c++ int val; cin >> val; // 从键盘输入要查找的元素的值 Node *p = head->next; // 定义指针p指向第一个节点 while (p != NULL && p->data != val) { p = p->next; // 指针p一直向后移动,直到找到第一个数据域等于val的节点 } if (p != NULL) { // 如果找到了该节点 cout << "该元素在链表中" << endl; } else { cout << "该元素不在链表中" << endl; } ``` 以上就是现单向链表的基本步骤,希望对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值