精华内容
下载资源
问答
  • C语言错误处理-输出错误信息 程序开发过程中,不可避免地会因为细节疏忽导致程序的编译、运行出错,当出现错误时编译器一般会将错误信息展示出来,但由程序操作或用户输入导致的错误往往会使程序直接崩溃并无任何的...

    C语言错误处理-输出错误信息

    程序开发过程中,不可避免地会因为细节疏忽导致程序的编译、运行出错,当出现错误时编译器一般会将错误信息展示出来,但由程序操作或用户输入导致的错误往往会使程序直接崩溃并无任何的提示,此时,就需要一种方法能够用在程序可能出错的地方,当错误发生时可以提前将错误信息输出并中止运行,避免程序的崩溃、简化程序bug的查找。下面介绍C语言中几种用来主动输出错误信息的方法。

    stderr

    首先介绍stderr标准错误,在程序创建的同时会开启三个默认的流,分别为标准输入stdin、标准输出stdout和标准错误stderrstdin默认指向键盘,stdoutstderr默认将数据输出到屏幕,也可以重定向输出到文件中。直接使用stderr是不会打印当前的错误信息的,它仅仅用来从输入中读取指定的信息然后再输出到指定的地方,这正是数据流的本意,数据从哪里来要到哪里去,所以,stderr还需要和能够读懂错误的函数进行配合使用。

    关于stderr还有一点要注意,虽然同样默认指向屏幕进行数据流的输出,但不同于stdout的是,为了尽快的输出错误信息,stderr被设计为无缓冲的输出,即不需要待缓冲区(满缓冲和行缓冲)填满后再进行I/O操作,什么意思呢,举个例子:

    fprintf(stdout,"Hello ");
    fprintf(stderr,"World!");
    

    Linux环境中stdout的输出方式是行缓冲,输出的字符会先存放在缓冲区,等按下回车键时才进行实际的I/O操作。而stderr是无缓冲输出,不需要等到换行符即可尽快的输出错误信息,因此,上述程序的打印结果为World!Hello

    errno

    在菜鸟中看到这样的一段解释,C 语言不提供对错误处理的直接支持,但是作为一种系统编程语言,它以返回值的形式允许您访问底层数据。在发生错误时,大多数的 C 或 UNIX 函数调用返回 1NULL,同时会设置一个错误代码 errno,该错误代码是全局变量,表示在函数调用期间发生了错误。您可以在 errno.h 头文件中找到各种各样的错误代码。

    打开errno.h头文件,可以看到许多对错误的定义,列举其中一部分

    #define ECHILD 10
    #define EAGAIN 11
    #define ENOMEM 12
    #define EACCES 13
    #define EFAULT 14
    #define EBUSY 16
    #define EEXIST 17
    #define EXDEV 18
    #define ENODEV 19
    #define ENOTDIR 20
    

    据此可以得知,errno代表的是错误的编号,不同的编号对应不同的错误信息,用于对当前程序中出现的错误进行反馈:

    fprintf(stderr, "错误号: %d\n", errno);
    

    如果仅仅这样去输出错误的话,打印的只有该错误对应的数字号,并没有直观的错误信息,所以还需要配合其他函数进行使用。

    perror()

    perror()是一个C库函数,其函数原型为 void perror(const char *str) ,包含在stdio.h头文件中,该函数用于显示传给它的字符串 str,后跟上一个冒号、一个空格和当前 errno 值的文本表示形式,不需要将errno 值手动传递给该函数,其会根据当前的errno 值主动打印信息提示。例如:

    perror("通过 perror 输出错误");
    // 假设此时errno指向的错误信息为未找到指定文件
    // 那么此时屏幕中会打印出:
    // 通过 perror 输出错误: No such file or directory
    

    在使用该函数前,最好将errno的值初始化为0,以此表示该程序目前无错误。

    strerror()

    C库函数strerror()的函数原型为char *strerror(int errnum),包含在string.h头文件中,其作用是从内部数组中搜索错误号 errno,并返回一个指向错误消息字符串的指针,该错误消息字符串用于描述当前程序中出现的错误。strerror 生成的错误字符串取决于开发平台和编译器。用法:

    fprintf(stderr, "Error: %s\n", strerror(errno));
    // 打印结果为
    //Error: No such file or directory
    
    展开全文
  • 22.c语言各种输入输出与错误处理

    千次阅读 2017-09-02 20:06:28
    1.errno 2.strerror(errno) 3.perror() 向标准错误输出信息:#include <stdio.h>int main () { FILE *fp; fp = fopen("file.txt", "r"); if( fp == NULL ) { perror("Error: "); return(-1); } fc

    1.errno
    这里写图片描述

    2.strerror(errno)
    这里写图片描述


    3.perror()
    这里写图片描述

    向标准错误输出信息:

    #include <stdio.h>
    
    int main ()
    {
       FILE *fp;
    
       fp = fopen("file.txt", "r");
       if( fp == NULL ) {
          perror("Error: ");
          return(-1);
       }
       fclose(fp);
    
       return(0);
    }

    4.printf()
    这里写图片描述

    5.fprintf()
    这里写图片描述

    6.sprintf()
    这里写图片描述
    这里写图片描述


    fgetc(), fgets()
    fputc(), fputs()
    
    getchar(),
    putchar(),
    
    ferror(), feof(), clearerr()

    http://www.yiibai.com/c_standard_library/c_function_perror.html

    http://www.360doc.com/content/12/1226/19/9305922_256429771.shtml

    http://blog.csdn.net/fareast8612/article/details/6848699

    http://www.yiibai.com/c_standard_library/c_function_fprintf.html

    展开全文
  • C语言处理命令行输入

    2019-10-03 19:29:21
    当往往由于C语言字符串比较难处理,最终出现各种奇怪的错误。现已算法指令为例,说明C语言命令行处理的框架。算法指令如下图所示: 算法指令 加法 ADD op1 op2 减法 SUB op1 op2 乘法 MUL ...

    在C语言中,我们经常碰到想要处理命令行的情况。当往往由于C语言字符串比较难处理,最终出现各种奇怪的错误。现已算法指令为例,说明C语言命令行处理的框架。算法指令如下图所示:

    算法指令
    加法 ADD op1 op2
    减法 SUB op1 op2
    乘法 MUL op1 op2
    除法 DIV op1 op2

    预期效果: 程序等待用户输入用户指令,当程序键入算法指令后,输出正确的结果;如果出现非法操作,则输出响应的出错信息。
    在main函数中,处理程序的代码框架,do_line处理由命令行获取的一行数据数据:

    1 while (fgets(buf, MAXLINE, stdin) != NULL)
    2 {
    3     if(do_line(buf))
    4         break;  
    5 }

    当do_line返回非0值时, 代表程序退出;但返回1时, 程序继续运行。注意fgets函数获取当前行的数据会包含’\n’,因此buf字符串末尾包含’\n’,’\0’两个字符。对每一行的处理在do_line_core函数中定义:

    1 flag = get_token(cmd, line, &pos);
    2 if (flag) {return 0;}                 //非法命令,重新输入
    3 if (strcmp(“q”, cmd) == 0) return 1;  //退出程序
    4     
    5 if(strcmp(“add”, cmd) == 0) ...
    6 else if(strcmp(“sub”, cmd) == 0) ...
    7 else if(strcmp(“mul”, cmd) == 0) ...
    8 else if(strcmp(“div”, cmd) == 0) ...
    9 else return 0;                        //未知命令,重新输入

    get_token获取下一个命令或操作数,其中pos代表读取的当前地址。当获取的命令为非法命令(为空)时,返回1;否则返回0。

     1 int get_token(char *token, char *line, int *pos)
     2 {
     3     /* 保存当前的token指针 */
     4     char *token_saved = token;
     5     /* 去除开头的空格符号 */
     6     while (isspace(line[*pos]) && line[*pos]) (*pos)++;
     7     /* 获取pos位置开始的下一条命令或操作符 */
     8     while (!isspace(line[*pos]) && line[*pos])
     9     {
    10         *token = line[*pos];
    11         token++;
    12         (*pos)++;
    13     }
    14     *token = ‘\0’;
    15     /* 字符串为空,返回1 */
    16     if (strcmp(token_saved, “”) == 0) return 1;
    17     return 0;
    18 }

     


    简化
    * 如果使用全局变量来描述每一行的数据,可以减少函数的参数。
    * 如果在*nix环境下,可以使用setjmp, longjmp来简化处理逻辑1


    1. 《UNIX环境高级编程》第7章, “setjmp函数和longjmp函数“。 

     

    转载于:https://www.cnblogs.com/tmtvs/p/4452258.html

    展开全文
  • 众所周知,当别人使用你的程序的,经常输入错误,然后你的程序没写处理错误输入,那就gg了。 因此,我写了个例子供大家参考: int decide ( ) { int n ; while ( 1 ) { scanf ( "%ld" , & ...

    众所周知,当别人使用你的程序的,经常输入错误,然后你的程序没写处理错误输入,那就gg了。
    因此,我写了个例子供大家参考:

    int decide()
    {
    	int n;
    	while (1)
    	{
    		scanf("%ld", &n);
    		while (getchar() != '\n');
    		if (n >= 1 && n <= 50 && n != 0)
    		{
    			break;
    		}
    		puts("请输入一个有效的值!\n");
    	}
    	return n;
    }
    

    (输入的值只能在1-50之内)

    展开全文
  • C语言技巧--对错误输入处理

    千次阅读 2012-04-21 15:09:48
    在编写C控制台程序时,常常要从键盘接收数据,而用户输入的数据经常是不合法的, 或者每次都有多余的输入,如果不处理的话,...错误或多余的输入很重要。  下面是我的方法:   char ch; while ( (ch=getchar())
  • C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象...
  • C语言是面向过程的,而C++是面向对象的 海风教育投诉 海风教育在线辅导0元一对一试听课等你来领取,领取课程方法: ...C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得...
  • 改写 cat 程序,将其出错信息写到标准错误文件上: #include <stdio.h> /* cat: concatenate files, version 2 */ main(int argc, char *argv[]) { FILE *fp; void filecopy(FILE *, FILE *); char *prog =...
  • C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过...
  • 作为程序员,除了完成编程的本职工作,还要事先预料一些可能的输入错误,这样才能编写出能检测并处理这些问题的程序。例如,假设我们编写了一个处理非负数整数的循环,但是用户很可能输入一个负数。你可以使用关系...
  • 程序执行时,为其打开面向终端的文件流,分别是:标准输入(stdin)"scanf"、标准输出(stdout)"printf"、标准错误输出(stderr)"警告或者报错" 标准错误输出演示: /* * 标准错误流...
  • ● 当程序开始执行时有三个文件及其相联系的的流被自动打开——即标准输入、标准输出和标准错误 ● 流提供了文件与程序之间的信息交流通道 ● 标准输入流使得程序能够从键盘上读入数据而标准输出流使得程序能够将...
  • C语言编译系统对数组名的处理是:数组名代表该数组的起始地址,且scanf函数中的输入项是字符数组名,不必要再加地址符&。应改为: scanf("%s",str); 18.同时定义了形参和函数中的局部变量。 int max(x,y) int x,y,z;...
  • 有时候一时的疏忽大意造成的麻烦远比逻辑错误更难找出。下面写几个自己遇见的几个常见但不易找出的错误。...偶然发现,其实错误只是在提示行输入的时候,符号输入成为了中文标点,更改过来就解决了。 第1
  • 将$和*之间所有的字符做^运算(第一个字符和第二个字符异或,结果再和第三个字符异或,依此类推)之后的值对65536取余后的结果,应该和*后面的两个十六进制数字的值相等,否则的话说明这条语句在传输中发生了错误。...
  • 之直接IO/文件定位/错误处理 直接输入/输出函数 fread()函数 size_t fread(void *ptr,size_t size,size_t nobj,FILE *stream) fread函数从流 stream 中读取最多 nobj 个长度为 size 的对象,并保存到 ptr 指向的数组...
  • C语言中标准输入流、标准输出流、标准错误输出流 在Linux中,所有对设备和文件的操作都使用文件描述符来进行。 Linux中一个进程启动时,都会打开3个文件:标准输入、标准输出和标准出错处理。这三个文件分别对应...
  • 在学习c primer plus 的时候发现处理错误输入的方法有两种 第一种:使用scanf("%*s"); #include int main(void) { int i = 0; while (scanf("%d",&i)!=1) { scanf("%*s");//第一种方法 printf("请再次输入\n...
  • 如果是用C语言考试,且HW的需要自己写输入输出的,请注意。 以下绝对不能用 void main() { return ; } 图省事不写返回值,但是会导致网站一直报错,输出无法正常输出,fflush(stdout)刷新控制台输出也搞不定,...
  • C语言中的Nan错误

    千次阅读 2018-03-01 11:47:19
    值异常错误还是蛮常见的,一般出现在除零、输入值超出函数的变量范围等情况下。 因此编程中经常需要对前一阶段的结果值进行检查和处理的语句,提高程序的稳定性。 下面会罗列一些出现NaN错误的具体情况,持续更新...
  • 字符输入输出函数fgetc,fputc,他们能够完成一个字符在磁盘文件中的读出与写入。 int fputc(int ch,FILE*steam); int fgetc(FILE*steam); 上述两个函数的返回值均为整型。fputc函数返回一个向文件所写字符的值...
  • C语言是面向过程的而C是面向对象的 C和C++的区别 C是一个结构化语言它的重点在于算法和数据结构C程序的设计首要考虑的是如何通过一个过程对输入或环境条件进行运算处理得到输出或实现过程事务控制 C++首要考虑的是...
  • C语言中标准输入流、标准输出流、标准错误输出流 在Linux中,所有对设备和文件的操作都使用文件描述符来进行。 Linux中一个进程启动时,都会打开3个文件:标准输入、标准输出和标准出错处理。这三个文件 分别对应...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 364
精华内容 145
关键字:

c语言输入错误处理

c语言 订阅