c语言有没有异常处理

如何用C语言实现异常/状况处理机制

反对,不会显示你的姓名

余天升网络安全、密码学、编程语言、编程话题优秀回答者 …

2 人赞同

在没有垃圾回收的情况下,使用异常机制绝对会降低程序的质量。Symbian C++中,使用了一种Leave机制,是对C++中异常机制的包装,而且因为Symbian系统运行在资源有限的嵌入式设备上的原因,栈空间很小,几乎所有的数据都要放在堆上,所以Symbian C++中引入了… 显示全部

在没有垃圾回收的情况下,使用异常机制绝对会降低程序的质量。Symbian C++中,使用了一种Leave机制,是对C++中异常机制的包装,而且因为Symbian系统运行在资源有限的嵌入式设备上的原因,栈空间很小,几乎所有的数据都要放在堆上,所以Symbian C++中引入了清除栈机制来避免内存泄漏的问题。

Symbian C++中要求,刚创建的对象,在没有保存到别的对象之前,应该立刻放到清除栈中保存,以便一旦产生Leave(异常),系统可以将清除栈中的对象销毁,防止内存泄漏。于是这样子代码就好麻烦了,每一次都要写类似的代码

HSomeClass* anInstance = HSomeClass.NewL();

CleanupStack::PushL(anInstance);

HSomeOtherClass* aNewInstance = HSomeOtherClass.NewL();

CleanupStack::PushL(aNewInstance);

…….

CleanupStack::Pop();

return;

所以,如果你想在C中使用异常机制的话,那么你需要:包装把setjump包装成TRAP宏,然后在实现一个清除栈。这个清除栈要分类型,一般的数据是一种,句柄又是一种,C中还不好实现类似IDispose之类的接口。另外,Symbian没落的一个原因是,这样的机制过于复杂,好多人都搞不懂,还是负责垃圾回收的Java比较方便,详见另外一则答案 。

c语言检测到无效的异常处理要导入什么库才能使用

这个用C实现的异常处理的关键函数是setjmp和longjmp,setjmp函数可以实现非局部标号,而longjmp实现程序内部的任意跳转(与之类似的我们经常使用的goto只能实现函数内部的跳转)。这两个函数的相互组合使用,百度百科给了如下总结:

1.setjmp(j)设置“jump”点,用正确的程序上下文填充jmp_buf对象j。这个上下文包括程序存放位置、栈和框架指针,其它重要的寄存器和内存数据。当初始化完jump的上下文,setjmp()返回0值。

2. 以后调用longjmp(j,r)的效果就是一个非局部的goto或“长跳转”到由j描述的上下文处(也就是到那原来设置j的setjmp()处)。当作为长跳转的目标而被调用时,setjmp()返回r或1(如果r设为0的话)。(记住,setjmp()不能在这种情况时返回0。)

通过有两类返回值,setjmp()让你知道它正在被怎么使用。当设置j时,setjmp()如你期望地执行;但当作为长跳转的目标时,setjmp()就从外面“唤醒”它的上下文。

我封装的异常处理库也是按照上面总结的方法使用的,理解了上面的总结再看代码就非常简单了。

在需要抛出异常的地方使用Throw宏抛出异常,它两个参数,一个是异常类型,一个是异常说明字符串。也可以使用ThrowAll来抛出一个任意类型的异常,但是此时只能使用Except才能捕获。

将可能出现异常的代码段使用Try包含起来。OnExcept用来捕获异常,它有一个参数,标记需要捕获什么类型的异常。如果此时有异常产生,异常类型与OnExcept要捕获的类型一致能会捕获到这个异常,否则抛弃。而如果使用Except宏则会捕获任意类型的异常。

最后需要调用Finally宏来进行清理,包括释放在Try宏内申请的内存空间。

一个简单的使用例子如下:

[cpp] view plaincopyprint?

#include stdio.h

#include excp.h

void fun(void* p){

if(p == NULL) Throw(1, “这个指针是空的呀!!!”);

else printf(“神马都是浮云!/n”);

}

int main(){

void* p = NULL;

Try{

fun(p);

}

OnException(1){

printf(“%s/n”, Message);

}

Finally{

printf(“这个指针是空的我有啥用呀?/n”);

}

return 0;

}

[cpp] view plaincopyprint?

#include stdio.h

#include excp.h

void fun(void* p){

if(p == NULL) Throw(1, “这个指针是空的呀!!!”);

else printf(“神马都是浮云!/n”);

}

int main(){

void* p = NULL;

Try{

fun(p);

}

OnException(1){

printf(“%s/n”, Message);

}

Finally{

printf(“这个指针是空的我有啥用呀?/n”);

}

return 0;

}

文章知识点与官方知识档案匹配

C技能树首页概览

108976 人正在系统学习中

C语言异常处理和exit()怎样使用?

c语言中exit()函数的用法:

用exit()函数可以退出程序并将控制权返回给操作系统,而用return语句可以从一个函数中返回并将控制权返回给调用该函数的函数。如果在main()函数中加入return语句,那么在执行这条语句后将退出main()函数并将控制权返回给操作系统,这样的一条return语句和exit()函数的作用是相同的。下例是一个使用了exit()函数和return语句的程序:

#include stdio.h

#include stdlib.h

int main (int, char** );

int do_processing (void);

int do_something_daring();

int main (int argc, char** argv)

{

int ret_code;

if (argc 3)

{

printf (“Wrong number of arguments used ! \n”);

/* return 1 to the operating system * /

exit(1);

}

ret_code = do_processing ();

……

/* return 0 to the operating system * /

exit(0);

}

int do_processing(void)

{

int rc;

rc = do_aomcthing_daring();

if (rc == ERROR)

{

printf (“Something fiahy ia going on around here… *\n);

/* return rc to the operating syatem * /

exit (re);

}

/* return 0 to the calling function * /

return 0;

}

在上例的main()函数中,如果argc小于3,程序就会退出。语句“exit(1)”指示程序在退出时将数字1返回给操作系统。操作系统有时会根据程序的返回值进行一些相关的操作,例如许多DOS批处理文件会通过一个名为ERRORLEVEL的全局变量来检查可执行程序的返回值。

c语言有没有异常处理

c语言未经处理的异常,求大佬指点

您好,很高兴回答您的问题。

您的这个题目,系统已经很明显告诉您了错误的原因。因为您定义的x为字符型数据,那么它对应的输入输出格式符为%c,但是您在输入语句中写的是%s,是字符串格式,不符合字符型单个变量的输入输出。根据题目意思,应该是要输入字符串,那么定义的时候就要写成char x[2],因为存放的是性别中文字,所以数组长度定义为2就可以了。您再试试哦。

c语言库函数中有error函数吗?

c语言标准库函数里没有error函数。C语言对异常的处理确实不够好,大多的时候都需要人工除错。

有几个类似的函数,分别处理各种情况下的异常:

ferror函数:在调用各种输入输出函数(如

putc.getc.fread.fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查。

它的一般调用形式为

ferror(fp);如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错。应该注意,对同一个文件

每一次调用输入输出函数,均产生一个新的ferror函

数值,因此,应当在调用一个输入输出函数后立即检

查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动置为0。在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你调用”某些”函数出错时,该函数已经重新设置了errno的值。perror函数只是将你输入的一些信息和现在的errno所对应的错误一起输出。

perror函数:

用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数

s

所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno

的值来决定要输出的字符串。

strerror函数:用来

从错误号码

用英文表达的错误内容,返回指针,指向这段英文字符串。如果你不知道错误号,那么在出错发生时,及时用

errno

的当前值

作参数,打印这段字符串。

C语言出现异常怎么解决?

操作起来很简单:在菜单栏以此单击”Build”→“Bulid Options”弹出一个对话框,在Category那有个下拉列表的(默认好像是C++ Language),点击选择C Lanuage。然后紧接着下面有五个小钩钩,去掉最后一个。(或者把Raw Options下面那个框里的-fallow-single-precision删掉,是一样的。)点击OK,完成。

我的Cfree还没汉化,不知道你的汉化了没,所以直接照我的来告诉你了。天哪…这个问题也困扰了我很久,装了无数个版本的Cfree…

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月27日 01:06:56
下一篇 2024年3月27日 01:15:14

相关推荐

  • 郝斌吧c语言老师联系方式,郝斌c语言入门视频教程

    郝斌老师的c语言讲得怎么样? 1、郝斌老师确实好,想当初我自学的时候,在床上看郝斌老师的视频一看就是1点多,现在学编程,C语言对我的影响很大。 2、C语言网上的课程是很多的,很推荐去B站找一找学习视频,章节也分的很详细;另外就是郝斌的C语言课还是不错的,不至于讲的很枯燥,很通俗易懂,也很适合初学者去学。 3、郝斌,现在瑞德学校担任教学组长,曾在雅博等公司担任…

    2024年5月18日
    3700
  • 百钱买鸡c语言,c语言解决百钱买百鸡

    百鸡问题怎么用C语言求解 题目意思是公鸡一只5块钱(假设),母鸡一只3块钱,小鸡三只1块钱。现在有100块钱买了100只鸡,问其中公鸡母鸡小鸡各多少只。这个算法用的是穷举法。 百钱买百鸡问题——一百个铜钱买了一百只鸡,其中公鸡一只5钱、母鸡一只3钱,小鸡一钱3只,问一百只鸡中公鸡、母鸡、小鸡各多少)。 看一下图吧,正确结果,能看清吗?意思是一样的,就是两个等…

    2024年5月18日
    4500
  • 双语版c语言苏小红二2手,苏小红c语言第三版和第四版区别

    c语言程序设计苏小红和谭浩强版区别 1、指代不同 (1)C程序设计谭浩强版本的第四版:这是清华大学出版社2010年出版的一本书,作者是谭浩强。(2)C程序设计谭浩强版本的第三版:被普遍认为是学习C语言的一本好教科书,并且被全国大多数大学所选择。 2、最好的就是谭浩强的《C语言程序设计》。整体来说,这本书是比较通俗易懂的,基本上讲清楚了语法,也适合0基础的学生…

    2024年5月18日
    3800
  • c语言里面scanf怎么用,c语音scanf怎么用

    c语言scanf的用法 1、scanf 函数最主要的用法是:scanf(输入控制符, 输入参数);功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。 2、scanf是C语言中的一个输入函数,与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include 。(在有一些…

    2024年5月18日
    3400
  • 用c语言解决数学问题,c语言经典数学问题编程例题

    用c语言解答数学问题? 首先在Visual Studio 2019中新建一个C语言文件,如下图所示。接着导入如下图所示的库文件,所需要的数学计算函数都在里面。然后运用scanf函数来接收用户输入的三个数字,如下图所示。 a&&b,a和b的逻辑与的值。是C语言里的一种逻辑表达式。&&表示的意思是数学中的逻辑与操作。在C语言中非0…

    2024年5月18日
    2900
  • mac运行c语言程序,macbook运行c语言

    mac系统下c语言使用system();函数遇到的问题 你用mac下仍然可以用system()函数来执行系统命令。至于你说的头文件找不到可以用stdlib.h.你直接在xcode可能看不到清屏效果,好像要设置环境变量还是啥的。但是用xcode编译好的程序,直接运行程序是有清屏效果的。 system语句,作用为调用系统命令。声明于stdlib.h,形式为 in…

    2024年5月18日
    3100
  • c语言交换算法,c语言数据交换的算法

    C语言编写一个带flag冒泡排序算法并打印输出比较次数和交换次数?_百度… 1、C语言实现Bubblesort:void bubblesort(int a[], int m) { int i,j; int tmp; int flag = 0; //设定标志,如果第一次循环比较时没有发生交换,则说明数组是升序排序,不用排序,提前结束循环。 2、冒泡…

    2024年5月18日
    3700
  • c语言goto使用,c语言中goto

    单片机C语言中goto可以这样用吗? C语言语句中可以用goto跳转吗  C语言可以用goto语句,但goto语句是非结构化程序设计时代的产物,现在一般都不推荐用,因为大部分可以使用goto语句的场景,均可以使用其他的的语句代替。 goto语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。 原则上是最好不要用,因为程序要讲究结构性…

    2024年5月18日
    5300
  • c语言实现栈或队列结构,c语言队列和栈的区别

    数据结构如何通过C语言来实现,请举例说明,尽可能详细 您好,想要实现一个二叉树,需要用到结构体来存储每个节点的信息,并使用指针来存储每个节点的左右子节点的地址。 这个是堆栈。不管是C还是其他的语言里都应该有的,因为这在数据结构里是一种很常见的东西。如果你要用C语言实现的话,实现的手法大概也就只能从数组或者链表来实现了。数据结构书上很多。也很简单。 数据结构的…

    2024年5月18日
    3700
  • c语言如何向上取整,c+向上取整

    c语言中的取整函数int语句怎么用啊? 1、INT函数是要将数字向下舍入到最接近的整数。语法INT(number)其中number是需要进行向下舍入取整的实数。 2、向上向下,取整函数数只会对小数点后面的。数字不为零的数进行操作。要是给它一个整数 ,它就返回整数本身。对小数不为零的数操作:给定 9。调用用向下取整函数得到的是 4。调用用向上取整函数得到的是 …

    2024年5月18日
    4200

发表回复

登录后才能评论



关注微信