精华内容
下载资源
问答
  • 加入头等舱满了,会再次有一个if函数出来询问你是否可以换到经济舱,然而我定义 if(m=='y') 这个语句时候会直接输出下面else.....所以我不得不用数字来表示是否,比如输入8就代表可以,具体长这样 用...
  • C语言的fclose()函数

    2020-06-28 00:49:38
    C语言的fclose()函数 头文件:#include <stdio.h> 定义函数:int fclose(FILE * stream); 函数说明:fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中, 并释放系统所提供的文件...

    C语言的fclose()函数

    在这里插入图片描述
    头文件:#include <stdio.h>

    定义函数:int fclose(FILE * stream);

    函数说明:fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中, 并释放系统所提供的文件资源。必要时刷新缓冲区。

    对于比较正式的程序,应该检查是否成功关闭文件。如果成功关闭,fclose()函数返回0,否则返回EOF:

    if (fclose(fp) != 0)
      printf("Error in closing file %s\n",argv[1]);
    

    如果磁盘已满、移动硬盘被移除或出现I/O错误,都会导致调用fclose()函数失败。

    错误代码:EBADF 表示参数stream 非已打开的文件。

    示例请参考前面的博客《 C语言的fopen()函数》。


    参考资料:

    [1] 史蒂芬・普拉达. C Primer Plus (第6版) 中文版[M]. 人民邮电出版社, 2016.

    [2] C语言fclose()函数:关闭打开的文件-来源

    展开全文
  • 我们知道,在c语言中我们可以使用goto语句在一个函数中进行跳转,例如一个常用goto方式为: ...... //分配资源 ...... if error1  goto error; if error2
    http://yijiuzai.blog.163.com/blog/static/10375672720105197114165/

    我们知道,在c语言中我们可以使用goto语句在一个函数中进行跳转,例如一个常用的goto方式为:

    ......

    //分配资源

    ......

    if error1

       goto error;

    if error2

       goto error;

    ........

    error:

        ......

        // 释放资源

        ......

    但是goto语句也只限于一个函数内,不能进行函数间的跳转。在c语言中,进行函数间的跳转使用setjmp和longjmp函数。

    为什么要有个函数间的跳转呢,这是因为,如果我们在调用函数时,函数的调用的嵌套的层次很深的话,如果出错,那么一层一层的返回和判断就很麻烦,所以,如果出错,就可以直接返回到最上面的调用的函数就会很方便。

    我们来看一下这两个函数怎么使用,首先看一下这两个函数的原型:

    #include <setjmp.h>

    int setjmp(jmp_buf env);   //直接调用则返回0,如从longjmp调用则返回非0

    int longjmp(jmp_buf env, int val);

    jum_buf是一个类型,其中env存储了一些longjmp调用返回用来恢复栈状态的所有信息。longjmp中的env和setjmp中的env是同一个。val是程序员自定义的直,这个值用在setjmp的返回值中,这样我们就可以知道是在哪个的longjmp跳转回来的。另外,由于在不同的函数间调用setjmp和longjmp,而这两个函数要公用一个env变量,所以把env定义为一个全局变量。

    下面我们看一个简单的例子:

    view plaincopy to clipboardprint?
    #include <stdio.h>   
    #include <setjmp.h>   
    jmp_buf jmpbuffer;   
    void func1();   
    void func2();   
    int main(void)   
    {   
        printf("in main function! ");   
        if(setjmp(jmpbuffer) != 0)   
        {   
            printf("get the error from jump return! ");   
            return -1;   
        }   
        func1();   
           
        printf("main function end! ");   
        return 0;   
    }   
    void func1()   
    {   
        printf("in func1 function! ");   
        func2();   
    }   
    void func2()   
    {   
        printf("in func2 function! ");   
        longjmp(jmpbuffer, 1);   
    }  
    #include <stdio.h>
    #include <setjmp.h>
    jmp_buf jmpbuffer;
    void func1();
    void func2();
    int main(void)
    {
     printf("in main function! ");
     if(setjmp(jmpbuffer) != 0)
     {
      printf("get the error from jump return! ");
      return -1;
     }
     func1();
     
     printf("main function end! ");
     return 0;
    }
    void func1()
    {
     printf("in func1 function! ");
     func2();
    }
    void func2()
    {
     printf("in func2 function! ");
     longjmp(jmpbuffer, 1);
    }

    编译:gcc main.c

    运行:./a.out

    输出:

    in main function!
    in func1 function!
    in func2 function!
    get the error from jump return!

    我们在程序中可以看到,我们在main函数用setjmp中设置了一个接受跳转返回的点,在func2函数中用longjmp跳转返回。

    在跳转返回后,我们直接退出函数,那么后面的

        printf("main function end! ");
        return 0;
    这两个语句将得不到执行。

    前面我们说过longjmp函数中的val参数用来確定我们的jump是在哪产生的,下面我们修改一下前面的例子,看看怎样区别不同的跳转点。

    view plaincopy to clipboardprint?
    #include <stdio.h>   
    #include <setjmp.h>   
    jmp_buf jmpbuffer;   
    void func1();   
    void func2();   
    int main(void)   
    {   
        printf("in main function! ");   
        int errNum = 0;   
        errNum = setjmp(jmpbuffer);   
        if(errNum != 0)   
        {   
            if (errNum == 1)   
                printf("get the error from func1 function ! ");   
            if (errNum == 2)   
                printf("get the error from func2 function ! ");   
            return -1;   
        }   
        func1();   
           
        printf("main function end! ");   
        return 0;   
    }   
    void func1()   
    {   
        printf("in func1 function! ");   
        longjmp(jmpbuffer, 1);   
        func2();   
    }   
    void func2()   
    {   
        printf("in func2 function! ");   
        longjmp(jmpbuffer, 2);   
    }  
    #include <stdio.h>
    #include <setjmp.h>
    jmp_buf jmpbuffer;
    void func1();
    void func2();
    int main(void)
    {
     printf("in main function! ");
     int errNum = 0;
     errNum = setjmp(jmpbuffer);
     if(errNum != 0)
     {
      if (errNum == 1)
       printf("get the error from func1 function ! ");
      if (errNum == 2)
       printf("get the error from func2 function ! ");
      return -1;
     }
     func1();
     
     printf("main function end! ");
     return 0;
    }
    void func1()
    {
     printf("in func1 function! ");
     longjmp(jmpbuffer, 1);
     func2();
    }
    void func2()
    {
     printf("in func2 function! ");
     longjmp(jmpbuffer, 2);
    }
     


    展开全文
  • 先来看这样一个例子,利用fork调用execlp()函数来在Linux下实现ps或ls命令: #include sys/types.h ... printf(Fork Error\n); } //son else if(result==0) {//调用execlp()函数,相当于ps -ef if((result=e
  • 如果1个switch有多个case,或是有多个if-else语句,不利于程序阅读和扩展。改进方法可以使用函数指针数组方式替换。 一、函数指针数组 文章目录使用原因一、函数指针数组总结 一、函数指针数组 直接上代码 #...

    使用原因

    如果1个switch有多个case,或是有多个if-else语句,不利于程序的阅读和扩展。改进方法可以使用函数指针数组的方式替换。

    一、函数指针数组


    一、函数指针数组
    直接上代码

    #include <stdio.h>
    #include <stdlib.h>
    
    #define SUCCESS 0
    #define ERROR -1
    #define SIZE(a) ((sizeof(a)) / (sizeof(a[0])))  //表的大小
    
    typedef struct
    {
    	int event_id;    //event名称
    	void *data;      //event的数据
    	int datalen;     //event数据长度
    } event_ind;
    
    typedef int (*event_func)(event_ind *);    /* 主动上报函数类型 */
    
    typedef struct {
    	int event_id;             /* event名称 */
    	event_func event_func;    /* event处理 */
    } event_type;
    
    typedef enum {
    	/* RING */
    	EVENT_RING = 0,
    	/* ^SIMHOTPLUG */
    	EVENT_SIM_HOT_PLUG,
    
    	EVENT_END
    } event_id_e_type;
    
    int RingEvent(event_ind* ind)
    {
    	printf("ring event\n");
    	return SUCCESS;
    }
    
    int SimHotPlugEvent(event_ind *ind)
    {
    	printf("sim hot plug event\n");
    	return SUCCESS;
    }
    
    /* 上报EVENT */
    static event_type g_event_ind[] = {
    	{ EVENT_RING,            RingEvent },
    	{ EVENT_SIM_HOT_PLUG,    SimHotPlugEvent }
    
    };
    
    event_type *event_get(int event_id)
    {
    	unsigned int i;
    	printf("需要查找的event id:%d\n", event_id);
    
    	printf("开始从表中查找支持的event id \n");
    	for (i = 0; i < SIZE(g_event_ind); i++) {
    		if(event_id == g_event_ind[i].event_id) {
    			printf("查找到了 %d\n",g_event_ind[i].event_id);
    			return &g_event_ind[i];
    		}
    	}
            printf("表中没查到event id\n");
    	return NULL;
    }
    
    void init_event(event_ind * ind)
    {
    	int id;
    	scanf("%d",&id);
    	printf("id is %d\n",id);
    	ind->event_id = id;
    	printf("event_id is %d\n",ind->event_id);
    	ind->data = NULL;
    	ind->datalen = 0;
    }
    
    int main()
    {
    	event_type *event = NULL;
    	event_ind *ind;
    //	event_ind temp;
    	int ret;
    
    //	ind = &temp; //结构体指针赋值,直接给了局部变量的栈空间,也可以malloc
    
        ind = (event_ind *)malloc(sizeof(event_ind));
    	memset(ind, 0, sizeof(*ind));
    
    	/* 2021.4.8  没验证 */
    	ind->data = (void *)malloc(strlen(data)); //如果data是结构体,需要sizeof()
    	memset(ind->data, 0, strlen(data));
    	/* 2021.4.8  没验证 */
    	
    	/* event数据的初始化 */
    	init_event(ind);
    	printf("init end\n");
    
    	/* 从表中查找支持的事件 */
    	event = event_get(ind->event_id);
    	if (event == NULL) {
    		return ERROR;
    	}
    
    	/* 处理上报事件event */
    	ret = event->event_func(ind);
    	if(ret != SUCCESS) {
    		return ERROR;
    	}
    	
    	/* 2021.4.8  没验证 */
    	if(ind->data) {
    		free(ind->data);
    	}
    	/* 2021.4.8  没验证 */
        free(ind);
    }
    
    
    

    在这里插入图片描述

    总结

    需要注意的点
    1、event处理函数的形式要和函数指针的定义相同
    2、结构体指针的赋值
    3、表-也就是函数指针数组的定义要和结构体一致。

    修改:ind->data也有空间,申请也需要申请,代码需要修改。释放也是先释放ind->data,再释放ind。

    展开全文
  • C语言命令实现各种函数的调用 例:函数名: open 功 能: 打开一个文件用于读或写 用 法: int open(char *pathname, int access[, int permiss]); 程序例: #include <string.h> #include <stdio.h> #include ...
  • 清林,博客名:飞空静渡   我们知道,在c语言中我们可以使用goto语句在一个函数中进行跳转,例如一个常用goto方式为: ...... //分配资源 ...... if error1  goto error;...

    http://blog.csdn.net/fjb2080/archive/2010/01/12/5175722.aspx

    作者:清林,博客名:飞空静渡

     

    我们知道,在c语言中我们可以使用goto语句在一个函数中进行跳转,例如一个常用的goto方式为:

    ......

    //分配资源

    ......

    if error1

       goto error;

    if error2

       goto error;

    ........

    error:

        ......

        // 释放资源

        ......

    但是goto语句也只限于一个函数内,不能进行函数间的跳转。在c语言中,进行函数间的跳转使用setjmp和longjmp函数。

    为什么要有个函数间的跳转呢,这是因为,如果我们在调用函数时,函数的调用的嵌套的层次很深的话,如果出错,那么一层一层的返回和判断就很麻烦,所以,如果出错,就可以直接返回到最上面的调用的函数就会很方便。

    我们来看一下这两个函数怎么使用,首先看一下这两个函数的原型:

    #include <setjmp.h>

    int setjmp(jmp_buf env);   //直接调用则返回0,如从longjmp调用则返回非0

    int longjmp(jmp_buf env, int val);

    jum_buf是一个类型,其中env存储了一些longjmp调用返回用来恢复栈状态的所有信息。longjmp中的env和setjmp中的env是同一个。val是程序员自定义的直,这个值用在setjmp的返回值中,这样我们就可以知道是在哪个的longjmp跳转回来的。另外,由于在不同的函数间调用setjmp和longjmp,而这两个函数要公用一个env变量,所以把env定义为一个全局变量。

    下面我们看一个简单的例子:

     

    编译:gcc main.c

    运行:./a.out

    输出:

    in main function!
    in func1 function!
    get the error from func1 function !

    注意:不可这样

    if(setjmp(jmpbuff) == 1)

      ........

    if(setjmp(jmpbuff) == 2)

      ........

    这样会在main中设置两个跳转返回点,而且是同一个jmpbuff,那么前面一个会被后面一个覆盖,则用func1中的跳转返回点就是后面的那个,在main函数中就会比较返回值是否为2,因为在func1中跳转返回是1,因此会再次执行后面的func1函数,那么就会陷入死循环中了。

    我们知道,在一个进程中,当我们调用一个函数时,我们的进程就会在栈中分配一个新栈区给这个函数,当这个函数返回时,就销毁这个栈区。

    因此,当我们进行函数间的跳转时,我们上层的函数的某些变量的值是得不到保存的。我们可以看下是哪些变量受到影响。

    我们修改第一个例子:

     

    第一次,我们尝试不优化编译:

    编译:gcc main.c

    运行:./a.out

    输出:

    in func1 function!
    globVal = 101, autoVal = 102, regiVal = 103, volaVal = 104, statVal = 105
    in func2 function!
    get the error from jump return!
    globVal = 101, autoVal = 102, regiVal = 103, volaVal = 104, statVal = 105

    第二次,我们进行优化编译:

    编译:gcc -O main.c

    运行:./a.out

    输出:

    in func1 function!
    globVal = 101, autoVal = 102, regiVal = 103, volaVal = 104, statVal = 105
    in func2 function!
    get the error from jump return!
    globVal = 101, autoVal = 2, regiVal = 3, volaVal = 104, statVal = 105

    我们可以看到,全局、静态和易失性变量不受优化的影响,它们的值是最近变化的值。这也告诉我们如果我们写一个非局部跳转的程序,就应该使用volatile属性的变量。

     

     

    展开全文
  • // Exit if an error other than ERROR_PIPE_BUSY occurs. if (GetLastError() != ERROR_PIPE_BUSY) MyErrExit("1 Could not open pipe"); // All pipe instances are busy, so wait for 20 seconds. if (!...
  • color=#FFFF00][color=#FFCC00]C语言一个数据查找实验 程序可以编译通过,但是连接时候就会出bug,小白表示不知道怎么改了,请大神赐教 附连接时代码:[/color] --------------------Configuration: schtb -...
  • 函数指针作为另一函数的参数和函数的嵌套区别,感觉都是调用,有什么不一样呢?他们都适用在什么情况下!(我是在学非递归遍历二叉树时看到) Status Visit(TElemType e){ printf("%c\n",e); return OK; ...
  • char * --> int 第一种 int main(int argc, char **argv) { int i = 0; int status = 1; char real[5]; //int num = 0;... if((dcm_fd=open(DCM_DEV, O_WRONLY))<... printf("Error opening
  • c语言中实现对对象管理 前面代码是这样 #include #include #include "ObjMgt.h" typedef struct key{ unsigned int key1; unsigned int key2; unsigned int key3; struct key * next; }keyall ; /*...
  • C语言:编写一个函数,求两个数最大公约数与最小公倍数。 #include <stdio.h> //求最大公约数与最小公倍数 void f(int m, int n) { int k, a, b; //如果两者中在任意一个为小于等于0 if (m <= 0 || n ...
  • if (i|| i>P->TD_length + 1) return ERROR; printf("请输入插入电话号码:"); scanf("%s", CR_phone); printf("请输入插入姓名:"); scanf("%s", CR_name); printf("请输入插入家庭住址:"); scanf("%...
  • c语言函数使用问题

    2019-07-21 10:56:18
    if(isdigit(c)!=0) printf("%d",c); else printf("error"); return 0; } ``` 请问输入数字为什么仍然是error?![图片说明](https://img-ask.csdn.net/upload/201907/21/1563677765_596749.jpg)
  • #include #include int main() { ... ... if(res1 == NULL) ... if(res2 == NULL) ...error: invalid conversion from 'const char*' to 'char*' [-fpermissive], 第一个不也是正常吗?实在没想明白
  • #define ERROR 0 typedef struct {ElemType elem[Maxsize]; int top; }SqStack; Status lnitStack(SqStack *S); Status Push(SqStack *S,ElemType e); Status Pop(SqStack *S,ElemType *e); Status ...
  • 函数中else…两句工作原理。请具体解释下面//两句。 long ff(int n){long f;if(n<0) printf("n<0,input error");else if(n==0||n==1) f=1; //为什么f=1,就不再继续递归调用? else f=ff(n-1)*n;//这一步...
  • C语言--文件操作函数

    2012-08-30 15:16:23
    1)fopen(filename, mode) mode: r w a r+ w+ a+ 在linux下加不加b都是一样  fclose(filename) ...if((fp = fopen("file", "r")) == NULL) { ... fprintf(stderr, "Error:……, %s \
  • If f(Answer) = 0 , please output "Error!" Input There are many test cases. In the first line there is a number T ( T ) shows the number of test cases. For each test cases there are two ...
  • 设计一个顺序循环队列和测试函数,结果编译时候就有好多error: syntax error before ""不知道要怎么改,求帮助~ 这是我代码: 头文件: #include typedef struct SeqCQueue { DataType queue[MaxQueueSize]; ...
  • C语言函数及相关知识

    2008-10-30 19:04:42
    C语言函数及相关知识 函数名: abort 功 能: 异常终止一个进程 用 法: void abort(void); 程序例: #include #include <stdlib.h> int main(void) { printf("Calling abort()\n"); abort(); return 0; /* This ...
  • #include<stdio.h> int add(int a,int b)//加法运算 { return a+b; } int sub(int a,int b)//减法运算 { return a-b; } int mult(int a,int b)//乘法运算 ... if(b!...// printf("error"); // return
  • 各位前辈,小弟新学C语言,怎么也调试不过,不知道哪里出了问题,请问我该怎么调试? 调用void SelfMul(int A1[][3],int A2[][3],int n)实现3阶矩阵乘法 #include //void SelfMul(int A1[][maxSize],int A2[]...
  • C语言函数R字母

    2005-10-01 08:21:00
    函数名: raise 功 能: 向正在执行程序发送一个信号 用 法: int raise(int sig); 程序例: #include int main(void) { int a, b; a = 10; b = 0; if (b == 0) /* preempt divide by...
  • ``` #include #define N 3 typedef struct Student ...c:\users\初晨陌夜\desktop\s.cpp(24) : error C2664: 'print' : cannot convert parameter 1 from 'struct Student' to 'struct Student []' 求指教
  • =1)printf("error\n"); fclose(fp); } void main(int argc,char *argv[]) { int i=0; while(i) { scanf("%s%d%d",&stud[i].name,&stud[i].age,&stud[i].num); i++; } save(); } ``` 上述从终端输入以后,在...
  • if(strcmp(stu[i].num,a)==0) //利用strcmp函数进行数组之间比较 { printf("\n学号:%s\t姓名:%s\t成绩:%-10.1f\n",stu[i].num,stu[i].name,stu[i].score); break; } } } } ``` ...
  • 再直接进入Choose函数" printf("是否重新进行?\nc->继续\ne->退出:");"这条语句。 想要知道为什么,求大神为新手求解,万分感谢! 结果如图: [图片说明]...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 212
精华内容 84
关键字:

c语言的iferror函数

c语言 订阅