c语言setjmp和longjmp怎么使用?
本帖最后由 red豆 于 2020-2-20 11:26 编辑我是刚入门的菜鸟,想问一下c语言中setjmp 和 longjmp怎么使用?
看了很多教程,还是不明白。
为了方便大家解释,我写了一段代码
#define _CRT_SECURE_NO_WARNINGS//scanf
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
float a(void);
int main()
{
printf("请输入");
int ab;
scanf("%d", &ab);
if (ab == 0)
{
//就跳转到下面hehehe处
}
else
printf("输入合法");
system("pause");
return 0;
}
float a(void)
{
hehehe:
printf("输入不合法");
return 0.0f;
}
向大家求助
本帖最后由 我的爱是你 于 2020-2-19 23:21 编辑
作为一个小白第一次听说这俩函数,经测试如下结果
代码如下
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
void a(void);
jmp_buf buf;
int main()
{
printf("请输入");
int ab;
scanf_s("%d", &ab);
a(); //注意要跳转函数必须要执行一次使其保存在堆栈中
if (ab == 0)
{
longjmp(buf,1); //这里已经跳过去了
}
else
printf("输入合法");
system("pause");
return 0;
}
void a()
{
if (setjmp(buf))
{
printf("输入不合法"); //输出成功,我们跳到这里了
}
}
其虽然输出成功但函数退出时会崩溃,经思考此为堆栈原因可能此函数保存在堆栈中出了什么问题 ,也可能此跳转函数我使用犯了个小错误。
我的爱是你 发表于 2020-2-19 23:19
作为一个小白第一次听说这俩函数,经测试如下结果
代码如下
感谢回答
我昨天试的时候没有加那句a();
输入0后报错0x031CCCE0 处有未经处理的异常(在 goto和函数.exe 中): 0x80000026: 一个长跳转已经运行。。
今天加上了,输出两个“输入不合法”??然后和你一样的错误
编译器vs2017 本帖最后由 我的爱是你 于 2020-2-20 10:54 编辑
昨天回完你就睡觉了,所以没有调试此错误。
其实很简单,此跳转不过跳到堆栈某位置后顺序执行程序而已 ,其自然只能从子函数跳主函数 ,要不跳子函数执行完子函数自然会报错。
这个问题调试一下就可以!
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
void a(void);
jmp_buf buf;
int main()
{
if (setjmp(buf))
{
puts("输入错误!!");
return -1;
}
a();
system("pause");
return 0;
}
void a()
{
printf("请输入");
int ab;
scanf_s("%d", &ab);
if (ab == 0)
{
longjmp(buf, 1); //这里已经跳过去了
}
else
printf("输入合法");
}
页:
[1]