搜档网
当前位置:搜档网 › assert()函数的用法

assert()函数的用法

assert()函数的用法
assert()函数的用法

assert() 函数用法

assert 宏的原型定义在assert.h 中,其作用是如果它的条件返回错误,则终止程序执行. 原型定义: 显示代码 打印

1 #include "assert.h"

2 void assert( int expression );

assert 的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr 打印一条出错信息,然后通过调用 abort 来终止程序运行。

请看下面的程序清单badptr.c : 显示代码 打印

01 #include

02 #include

03 #include

04 int main( void )

05 {

06 FILE *fp;

07

08 fp = fopen( "test.txt", "w" );//以可写方式打开一个文件,如果不存在就创建一个同名文件

09 assert( fp ); //所以这里不会出错

10 fclose( fp );

11

12 fp = fopen("noexitfile.txt", "r" );//以只读方式打开一个文件,如果不存在就打开文件失败

13 assert( fp ); //所以这里出错

14 fclose( fp ); //程序永远都执行不到这里来

15

16 return 0;

17 }

使用assert 的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。

在调试结束后,可以通过在包含#include 的语句之前插入 #define NDEBUG 来禁用assert 调用,示例代码如下: 显示代码 打印

1 #include

2 #define NDEBUG

3 #include

用法总结与注意事项:

1)在函数开始处检验传入参数的合法性

如:

显示代码

打印

01 int resetBufferSize(int nNewSize)

02 {

03 //功能:改变缓冲区大小,

04 //参数:nNewSize 缓冲区新长度

05 //返回值:缓冲区当前长度

06 //说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区

07 assert(nNewSize >= 0);

08 assert(nNewSize <= MAX_BUFFER_SIZE);

09

10 ...

11 }

2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败

不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);

好: assert(nOffset >= 0);

assert(nOffset+nSize <= m_nInfomationSize);

3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题

错误: assert(i++ < 100)

这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。

正确: assert(i < 100)

i++;

4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感

5)有的地方,assert不能代替条件过滤

#C++

程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。断言assert 是仅在Debug 版本起作用的宏,它用于检查“不应该”发生的情况。以下是一个内存复制程序,在运行过程中,如果assert 的参数为假,那么程序就会中止(一般地还会出现提示对话,说明在什么地方引发了assert)。

显示代码

打印

01 //复制不重叠的内存块

02 void memcpy(void *pvTo, void *pvFrom, size_t size)

03 {

04 void *pbTo = (byte *) pvTo;

05 void *pbFrom = (byte *) pvFrom;

06 assert( pvTo != NULL && pvFrom != NULL );

07 while(size - - > 0 )

08 *pbTo + + = *pbFrom + + ;

09 return (pvTo);

10 }

assert 不是一个仓促拼凑起来的宏,为了不在程序的Debug 版本和Release 版本引起差别,assert 不应该产生任何副作用。所以assert 不是函数,而是宏。程序员可以把assert 看成一个在任何系统状态下都可以安全使用的无害测试手段。

很少有比跟踪到程序的断言,却不知道该断言的作用更让人沮丧的事了。你化了很多时间,不是为了排除错误,而只是为了弄清楚这个错误到底是什么。有的时候,程序员偶尔还会设计出有错误的断言。所以如果搞不清楚断言检查的是什么,就很难判断错误是出现在程序中,还是出现在断言中。幸运的是这个问题很好解决,只要加上清晰的注释即可。这本是显而易见的事情,可是很少有程序员这样做。这好比一个人在森林里,看到树上钉着一块“危险”的大牌子。但危险到底是什么?树要倒?有废井?有野兽?除非告诉人们“危险”是什么,否则这个警告牌难以起到积极有效的作用。难以理解的断言常常被程序员忽略,甚至被删除。 [Maguire 1993]

以下是使用断言的几个原则:

(1)使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。

(2)使用断言对函数的参数进行确认。

(3)在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的

假定,就要使用断言对假定进行检查。

(4)一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐瞒错误。当进行防错性编程时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。

ASSERT ()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。

ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。

---------------------------------------------------------------

ASSERT宏定义如下

显示代码

打印

1 #define ASSERT(f)

2 do

3 {

4 if (!(f) && AfxAssertFailedLine(THIS_FILE, __LINE__))

5 AfxDebugBreak();

6 } while (0)

ASSERT(逻辑表达式)

如果括号中的逻辑表达式值为假的话,会弹出调试命令窗口,提示具体在哪个文件的哪一行发生了断言错误!

---------------------------------------------------------------

ASSERT

Evaluates an expression, and displays a diagnostic message if the expression is FALSE. Ignored i n retail builds.

Syntax

ASSERT(

cond

);

Parameters

cond

Expression to evaluate.

Remarks

In debug builds, if the expression is FALSE, this macro displays a message box with the text of the expression, the name of the source file, and the line number. The user can ignore the assertion, e nter the debugger, or quit the application.

Example

ASSERT(rtStartTime <= rtEndTime);

---------------------------------------------------------------

断言(ASSERT)的使用,方法很简单。为什么要用,初学者可能比较迷惑。

契约式编程讲的比较清楚,建议可以先看看这类书。

一个函数由前置条件、后置条件和不变式组成。在VC中,我们可以通过断言来保证这三个条件。可以大大提高了软件的质量。

---------------------------------------------------------------

如果ASSERT()中的条件不成立(比如 ASSERT(0) ; ),会弹出一个比较吓人的对话框。

点击重试,可以到达 ASSERT 断言不成立的那一行,

此时可以在watch窗口查看变量值,找出出错的原因。

如果程序能够继续运行,可以按F5继续调试。

assert() 函数用法

2007-10-17 12:15

assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:

#include

void assert( int expression );

assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,

然后通过调用 abort 来终止程序运行。

请看下面的程序清单badptr.c:

#include

#include

#include

int main( void )

{

FILE *fp;

fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件

assert( fp ); //所以这里不会出错

fclose( fp );

fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败

assert( fp ); //所以这里出错

fclose( fp ); //程序永远都执行不到这里来

return 0;

}

[root@localhost error_process]# gcc badptr.c

[root@localhost error_process]# ./a.out

a.out: badptr.c:14: main: Assertion `fp' failed.

已放弃

使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含#include 的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:

#include

#define NDEBUG

#include

用法总结与注意事项:

1)在函数开始处检验传入参数的合法性

如:

int resetBufferSize(int nNewSize)

{

//功能:改变缓冲区大小,

//参数:nNewSize 缓冲区新长度

//返回值:缓冲区当前长度

//说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区

assert(nNewSize >= 0);

assert(nNewSize <= MAX_BUFFER_SIZE);

...

}

2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败

不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);

好: assert(nOffset >= 0);

assert(nOffset+nSize <= m_nInfomationSize);

3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题

错误: assert(i++ < 100)

这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。

正确: assert(i < 100)

i++;

4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感

5)有的地方,assert不能代替条件过滤

C语言函数手册(DOC)

一、字符测试函数 isupper()测试字符是否为大写英文字 ispunct()测试字符是否为标点符号或特殊符号isspace()测试字符是否为空格字符 isprint()测试字符是否为可打印字符 islower()测试字符是否为小写字母 isgraphis()测试字符是否为可打印字符 isdigit()测试字符是否为阿拉伯数字 iscntrl()测试字符是否为ASCII码的控制字符isascii()测试字符是否为ASCII码字符 isalpha()测试字符是否为英文字母 isalnum()测试字符是否为英文或数字 isxdigit()测试字符是否为16进制数字 二、字符串操作函数 strtok()字符串分割函数 strstr()字符串查找函数 strspn()字符查找函数 strrchr()定位字符串中最后出现的指定字符 strpbrk()定位字符串中第一个出现的指定字符strncpy()复制字符串 strncat()字符串连接函数 strncasecmp()字符串比较函数(忽略大小写) strlen()字符串长度计算函数 strdup()复制字符串 strcspn()查找字符串 strcpy()复制字符串 strcoll()字符串比较函数(按字符排列次序) strcmp()字符串比较函数(比较字符串) strchr()字符串查找函数(返回首次出现字符的位置) strcat()连接字符串 strcasecmp()字符串比较函数(忽略大小写比较字符串) rindex()字符串查找函数(返回最后一次出现的位置) index()字符串查找函数(返回首次出现的位置) toupper()字符串转换函数(小写转大写) tolower()字符串转换函数(大写转小写) toascii()将整数转换成合法的ASCII码字符 strtoul()将字符串转换成无符号长整型数

C语言断言assert的用法

assert的用法 assert(); 当expression结果为“假”时,会在stderr中输出这条语句所在的文件名和行号,以及这条表达式。这只在调试版本中起作用,在Release版本中不会产生任何代码。 通常当我们使用assert时,都在强烈说明一个含义:在这里必然如此。它通常用于一个函数的先验条件和后验条件的检查。比如我写一个C风格复制字符串的函数,并且认为调用者不应该传入NULL指针: char * clone_string(const char * source) { char * result; assert(source != NULL); result = (char *)malloc(strlen(source) + 1); if (result != NULL) { strcpy(result, source); assert(strcmp(result, source) == 0); } return result; } 注意到我对source是否为NULL是用assert检查的,但对result是不是为NULL是用if语句判断的,这是因为在调用代码正确的情况下source必然不为NULL,如果断言失败,说明调用代码中有错误,需要修改;但result作为malloc的返回值则不一定,在malloc代码无误的情况下仍然可能返回NULL——当内存块不足时。最后又用assert对strcpy的结果进行检查,因为只要代码正确,无论什么情况strcpy应该正常完成复制,它没有malloc那种异常情况存在。 在《编程精粹》第二章(自己设计并使用断言)开始的一段话把assert的用途说的很清楚: 利用编译程序自动查错固然好,但我敢说只要你观察一下项目中那些比较明显的错误,就会发现编译程序所查出的只是其中的一小部分。我还敢说,如果排除掉了程序中的所有错误那么在大部分时间内程序都会正确工作。 还记得第1章中的下面代码吗? strCopy = memcpy(malloc(length), str, length); 该语句在多数情况下都会工作得很好,除非malloc的调用产生失败。当malloc失败时,就会给memcpy返回一个NULL指针。由于memcpy处理不了NULL指针,所以出现了错误。如果你很走运,在交付之前这个错误导致程序的瘫痪,从而暴露出来。但是如果你不走运,没有及时地发现这个错误,那某位顾客就一定会“走运”了。

10个示例让你的VLOOKUP函数应用从入门到精通

10个示例让你的VLOOKUP函数应用从入门到精通 VLOOKUP函数是众多的Excel用户最喜欢和最常用的函数之一,因此介绍VLOOKUP 函数使用技巧的文章也特别多。在《Excel函数学习4:VLOOKUP函数》中,我们学习了VLOOKUP函数的语法及应用,在Excel公式与函数之美前面的系列文章中,我们又详细探讨了VLOOKUP函数的4个参数。 熟练掌握VLOOKUP函数的使用,是Excel必备技能之一。下面我们通过10个示例,进一步巩固VLOOKUP函数的使用技能。 一键直达>> Excel函数学习4:VLOOKUP函数 一键直达>> Excel公式与函数之美15:VLOOKUP函数的秘密 一键直达>> Excel公式与函数之美19:理解VLOOKUP函数第4个参数的真实含义 一键直达>> Excel公式与函数之美20:MATCH函数使VLOOKUP函数更灵活高效 一键直达>> Excel公式与函数之美21:INDIRECT函数使VLOOKUP函数实现多表查询 一键直达>>Excel公式与函数之美22:VLOOKUP函数查找技巧 概述 VLOOKUP函数最擅长在列中查找相匹配的数据,若找到匹配的数据,则在找到的数据所在行的右边从指定的列中获取数据。 示例1:查找郭靖的数学成绩 如图1所示,在最左边的列中是学生的姓名,在列B至列E中是不同科目的成绩。

图1 现在,我需要从上面的数据中找到郭靖的数学成绩。公式为: =VLOOKUP("郭靖",$A$3:$E$10,2,0) 公式有4个参数: ?“郭靖”——要查找的值。 ?$A$3:$E$10——查找的单元格区域。注意,Excel在最左列搜索要查找的值,本例中在A3:A10中查找姓名郭靖。 ?2——一旦找到了郭靖,将定位到区域的第2列,返回郭靖所在行相同行的值。数值2指定从区域中的第2列查找成绩。 ?0——告诉VLOOKUP函数仅查找完全匹配的值。 以上面的示例来演示VLOOKUP函数是如何工作的。 首先,在区域的最左列查找郭靖,从顶部到底部查找并发现在单元格A7中存储着这个值。

输入和输出函数的区别

输入输出函数区别如下: 一、printf 、sprintf、fprintf的区别 1.1 都是把格式好的字符串输出,只是输出的目标不一样: 1)、printf,是把格式字符串输出到标准输出(一般是屏幕、控制台,可以重定向),是和标准输出文件(stdout)关联的; 原型为: int printf(const char *format[,argument]...); 2)、sprintf,是把格式字符串输出到指定的字符串中,所以参数比printf多一个char*。这是目标字符串地址; 原型为:int sprintf(char *buffer,const char *format[,argument]...); 3)、fprintf,是把格式字符串输出到指定文件设备中,fprintf是格式化输出到一个stream,通常是到文件,所以参数比printf多一个文件指针FILE*; 原型为:int fprintf(FILE *stream,const char *format[,argument]...); 1.2. Fprintf c语言把文件看作一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。根据数据的组成形式,可分为ASCLL文件和二进制文件。ASCLL文件又称为文本文件(text),它的每个字节放一个ASCLL代码,代表一个字符。二进制文件是内存中的数据按其在内在中的存储形式原样输出到磁盘上存放。 1).fprintf(fp,"%d",buffer);是将格式化的数据写入文件; fprintf(文件指针,格式字符串,输出表列); fwrite(&buffer,sizeof(int),1,fp); 是以二进位方式写入文件 fwrite(数据,数据类型大小(字节数),写入数据的最大数据,文件指针); 由于fprintf写入是,对于整数来说,一位站一个字节, 比如1,占1个字节; 10,占2个字节; 100,占3个字节; 10000,占5个字节;所以文件的大小会随数据的大小而改变,对大数据空间占用很大。而fwrite是按二进制写入,所以写入数据所占空间是根据数据类型来确定,比如int的大小为4个字节(一般32位下),那么整数10所占空间为4个字节,100/10000所占空间也是4个字节,所以二进制写入比格式化写入更省空间。因此, 对于1 2 3 4 5 6 7 8 9 0 十个整数,用fprintf写入时,占10个字节;而用fwrite写入时,占40个字节。 对于100 101 102 103 104 105 106 107 108 109 110 这十个整数,用fprintf写入时,占30个字节;而用fwrite写入时,占40个字节。 对于10000 10100 10200 10300 10400 10500 10600 10700 10800 10900 1 1000 这十个整数,用fprintf写入时,占50个字节;而用fwrite写入时,还是

indirect函数的使用方法(间接引用)

indirect函数的使用方法 含义 此函数立即对引用进行计算,并显示其内容。当需要更改公式中单元格的引用,而不更改公式本身,请使用此函数,INDIRECT为间接引用。 语法 INDIRECT(ref_text,[a1]) Ref_text 为对单元格的引用,此单元格可以包含A1-样式的引用、R1C1-样式的引用、定义为引用的名称或对文本字符串单元格的引用。如果ref_text 不是合法的单元格的引用,函数INDIRECT 返回错误值#REF!或#NAME?。 如果ref_text 是对另一个工作簿的引用(外部引用),则工作簿必须被打开。如果源工作簿没有打开,函数INDIRECT 返回错误值#REF!。 a1 为一逻辑值,指明包含在单元格ref_text 中的引用的类型。 如果a1 为TRUE 或省略,ref_text 被解释为A1-样式的引用。 如果a1 为FALSE,ref_text 被解释为R1C1-样式的引用。 案例如下:

(案例一)工作簿内引用第一步 第二步

第三步 第四步

第五步 最终效果 (案例二)工作簿外引用 (1)步骤同案例一,只是引用在不同的sheet表里面 indirect(工作簿内).xlsx indirect(工作簿 外).xlsx indirect.xlsx

(2)老版excel用法 不同excel文件之间的引用案例 实例1 1:启动excel。 2:在Book1的Sheet1的单元格A1中键入“这是测试数据”。 在2003版及较早版的excel中,单击“文件”菜单上的“新建”,单击“工作簿”,然后点击“确定”。 3:在2007版中,单击按钮,单击“新建”,然后单击“创建”。 4:在Book2中,在Sheet1的单元格A1中键入Book1。 5:在Book2的Sheet1的单元格A2中键入Sheet1。 6:在Book2中,在Sheet1的单元格A3中键入A1。 7:保存这两个工作簿。 8:在2003版及较早版本的Excel中,在Book2的Sheet1的单元格B1中键入下面的公式:=INDIRECT(”’[“&A1&”.xls]”&A2&”’!”&A3) 在Excel 2007中,键入下面的公式: =INDIRECT(”’[“&A1&”.xls]”&A2&”’!”&A3) 该公式会返回“这是测试数据”。

sscanf,sscanf_s及其相关用法

sscanf,sscanf_s 及其相关用法 #include 定义函数 int sscanf (const char *str,const char * format,........); 函数说明 sscanf()会将参数 str 的字符串根据参数 format 字符串来转换并格式化数据。格式转换形式请参 考 scanf()。转换后的结果存于对应的参数内。 返回值 成功则返回参数数目,失败则返回-1,错误原因存于 errno 中。 返回0表示失败 否则,表 示正确格式化数据的个数 例如:sscanf(str,"%d%d%s", &i,&i2, &s); 如果三个变成都读入成 功会返回3。 如果只读入了第一个整数到 i 则会返回1。证明无法从 str 读入第二个整数。 main() { int i; unsigned int j; char input[ ]=”10 0x1b aaaaaaaa bbbbbbbb”; char s[5]; sscanf(input,”%d %x %5[a-z] %*s %f”,&i,&j,s,s); printf(“%d %d %s ”,i,j,s); } 执行 10 27 aaaaa 大家都知道 sscanf 是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。 它的使用方法简单, 特别对于整数和浮点数来说。 但新手可能并不知道处理字符串时的一些高级用法, 这里做个简要说明吧。 1. 常见用法。 charstr[512]={0}; sscanf("123456","%s",str); printf("str=%s",str); 2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。 sscanf("123456","%4s",str);

C++Assert

assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义如下: #include void assert( int expression ); assert的作用是现计算表达式expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用abort 来终止程序运行。 请看下面的程序清单badptr.c: #include #include #include int main( void ) { FILE *fp; fp = fopen( "test.txt", "w" ); //以可写的方式打开一个文件,如果不存在就创建一个同名文件 assert( fp ); //所以这里不会出错 fclose( fp ); fp = fopen( "noexitfile.txt", "r" ); //以只读的方式打开一个文件,如果不存在就打开文件失败 assert( fp ); //所以这里可能会出错 fclose( fp ); //如果出错,程序永远都执行不到这里来 return 0; } 在命令行下运行该程序,结果如下: [root@localhost error_process]# gcc badptr.c [root@localhost error_process]# ./a.out a.out: badptr.c:14: main: Assertion `fp'' failed. 已放弃 使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。 在调试结束后,可以通过在包含#include 的语句之前插入#define NDEBUG 来禁用assert调用,示例代码如下: #include #define NDEBUG #include assert的用法总结与注意事项: 1、在函数开始处检验传入参数的合法性,如: int resetBufferSize(int nNewSize) { //函数功能:改变缓冲区大小,//函数参数:nNewSize 缓冲区新长度//函数返回值:缓冲区当前长度//说明:保持原信息内容不变//nNewSize<=0表示清除缓冲区 assert(nNewSize >= 0); assert(nNewSize <= MAX_BUFFER_SIZE); } 2、每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观地判断是哪个条件失败,比较下面两种形式的代码: 不好:assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize); 好:assert(nOffset >= 0);

vb中msgbox用法

VB中的函数,可实现弹出窗口. 作用:在对话框中显示消息,等待用户单击按钮,并返回一个Integer 告诉用户单击哪一个按钮。 语法: MsgBox(prompt[, buttons] [, title] [, helpfile, context]) 参数说明: MsgBox 函数的语法具有以下几个命名参数: Prompt-------必需的。字符串表达式,作为显示在对话框中的消息。prompt 的最大长度大约为1024 个字符,由所用字符的宽度决定。如果prompt 的内容超过一行,则可以在每一行之间用回车符(Chr(13))、换行符(Chr(10)) 或是回车与换行符的组合(Chr(13) & Chr(10)) 将各行分隔开来。 Buttons-------可选的。数值表达式是值的总和,指定显示按钮的数目及形式,使用的图标样式,缺省按钮是什么以及消息框的强制回应等。如果省略,则buttons 的缺省值为 0。 Title-------可选的。在对话框标题栏中显示的字符串表达式。如果省略 title,则将应用程序名放在标题栏中。 Helpfile--------可选的。字符串表达式,识别用来向对话框提供上下文相关帮助的帮助文件。如果提供了helpfile,则也必须提供context。 Context-------可选的。数值表达式,由帮助文件的作者指定给适当的帮助主题的帮助上下文编号。如果提供了context,则也必须提供helpfile。 用于MsgBox函数中Button参数的常量 常量值说明 vbOKOnly 0 只显示“确定”按钮 VbOKCancel 1 显示“确定”和“取消”按钮 VbAbortRetryIgnore 2 显示“终止”、“重试”和“忽略” 按钮 VbYesNoCancel 3 显示“是”、“否”和“取消”按钮 VbYesNo 4 显示“是”和“否”按钮 VbRetryCancel 5 显示“重试”和“取消”按钮 VbCritical 16 显示“关键信息”图标 VbQuestion 32 显示“警告询问”图标 VbExclamation 48 显示“警告消息”图标 VbInformation 64 显示“通知消息”图标 vbDefaultButton1 0 第一个按钮是缺省值(缺省设置) vbDefaultButton2 256第二个按钮是缺省值 vbDefaultButton3 512第三个按钮是缺省值 vbDefaultButton4 768第四个按钮是缺省值 vbApplicationModal 0应用程序强制返回;应用程序一直被挂起,直到用户对消息框 作出响应才继续工作 vbSystemModal 4096系统强制返回;全部应用程序都被挂起,直到用户对消息框作 出响应才继续工作 vbMsgBoxHelpButton 16384将Help按钮添加到消息框 VbMsgBoxSetForeground 65536指定消息框窗口作为前景窗口 vbMsgBoxRight 524288文本为右对齐 vbMsgBoxRtlReading 1048576指定文本应为在希伯来和阿拉伯语系统中的从右到左显示 说明: (1)第一组值(0–5)描述了消息框中显示的按钮的类型与数目;第二组值(16,32,48,64)描述了图标的样式;第三组值(0,256,512,768)说明哪一个按钮是缺省值;而第四组值(0,4096)则决定消息框的强制返

断言(ASSERT)的用法

我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非“报错”。 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种“契约式编程”,在我的理解中,其表达的意思就是,程序在我的假设条件下,能够正常良好的运作,其实就相当于一个if语句: if(假设成立) { 程序正常运行; } else { 报错&&终止程序!(避免由程序运行引起更大的错误) } 但是这样写的话,就会有无数个if语句,甚至会出现,一个if语句的括号从文件头到文件尾,并且大多数情况下,我们要进行验证的假设,只是属于偶然性事件,又或者我们仅仅想测试一下,一些最坏情况是否发生,所以这里有了assert(). assert宏的原型定义在assert.h中,其作用是如果它的条件返回错误,则终止程序执行. 1 #include "assert.h" 2void assert(int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。 使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。 在调试结束后,可以通过在包含#include 的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:

1 #include 2#define NDEBUG 3 #include 用法总结与注意事项: 1)在函数开始处检验传入参数的合法性 如: 1int resetBufferSize(int nNewSize) 2 { 3//功能:改变缓冲区大小, 4//参数:nNewSize缓冲区新长度 5//返回值:缓冲区当前长度 6//说明:保持原信息内容不变nNewSize<=0表示清除缓冲区 7 assert(nNewSize>= 0); 8 assert(nNewSize<= MAX_BUFFER_SIZE); 9 10 ... 11 } 2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败 不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize); 好: assert(nOffset >= 0); assert(nOffset+nSize <= m_nInfomationSize); 3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题 错误: assert(i++ < 100)

MsgBox的使用

MsgBox函数 MsgBox函数的作用是弹出一个对话框,在其中显示的指定的数据和提示信息。此外,该函数还可以将返回用户在此对话框做的选择,并将返回值赋给指定变量。其语法格式为:MsgBox(信息内容(文本),对话框类型+图标类型(button),对话框题目(文本)) 注意:信息内容为必传参数。对话框类型和图标类型为非必传参数。对话框题目也为非必传参数,如果不写则为项目的标题。 button参数的取值。 名称值功能 VbOKOnly 0 确定按钮 VbOkCancel 1 确定和取消按钮 VbAortRetryIgnore 2 终止,重试和忽略按钮 VbYesNoCancel 3 是,否和取消按钮 VbYesNo 4 重试和取消按钮 Vbretrycancel 5 重试和取消按钮 VbCritical 16 停止图标 VbQuestion 32 问号(?)图标 VbExclamation 48 感叹号(!)图标 VbInformation 64 信息图标 VbDefaultButton1 0 默认按钮为第一按钮 VbDefaultButton2 256 默认按钮为第二按钮 VbDefaultButton3 512 默认按钮为第三按钮 vbDefaultButton4 768默认按钮为第四按钮 vbApplicationModal0应用程序强制返回;应用程序一直被挂起,直到用户对消息框作出响应才继续工作 vbSystemModal4096系统强制返回;全部应用程序都被挂起,直到用户对消息框作出响应才继续工作 vbMsgBoxHelpButton16384将Help按钮添加到消息框VbMsgBoxSetForeground 65536指定消息框窗口作为前景窗口

[整理]使用MsgBox函数

使用MsgBox 函数 你目前使用的MsgBox函数局限于给用户用一个简单的,一个按钮的对话框显示信息。你点击确定按钮或者回车来关闭该信息框。要创建一个简单的信息框,只要在MsgBox函数名称后面带上一个用引号包括起来的文本就可以了。换句话说,要显示信息“过程已完成”,你应该准备下列语句:MsgBox "过程已完成" ‘(注意,英文状态的引号) 你可以将它输入立即窗口,快速地测试上面的指令,当你输入完这条指令并且回车后,VB 就显示如,图4-5的信息框。图4-5 将文本作为MsgBox函数的参数,来给用户显示信息MsgBox函数允许你使用其它参数,使你可能决定可用的按钮数目,或者将默认的信息框的标题(Microsoft Excel)改为你自己的标题。也可以设置你自己的帮助主题。MsgBox的语法如下:MsgBox (prompt [, buttons] [, title], [, helpfile, context]),注意,MsgBox函数有五个参数,只有第一个,Prompt(提示),是必须的;这些列在方括号里面的参数都是可选的。当你在提示参数输入一个非常长的文本时,VB决定如何断句,使文本适合信息框 大小。我们在立即窗口里来做些练习,看不同的文本格式技巧: 1. 在立即窗口输入以下指令,确保在一行里输入整个文本,回车 MsgBox "All done. Now open ""Chap04.xls"" and place an empty disk in the diskette drive.The following procedure will copy this file to the disk."一旦回车,VB显示信息框,如图4-6图4-6 如果你设置一下文本格式,长信息看上去将会更吸引人如果你遇到编译错误,可以点击确定,然后确定文件名用双引号括起来——““Chap04.xls””。 当你的信息文本特别长时,你可以使用VBA函数Chr将它分割为好几行。Chr函数需要你跟 参数,这个参数是0到255之间的数字,它返回这个数字代表的字符。例如Chr(13)返回的是回车(这和按下回车键相同),以及Chr(10)返回换行字符(这在文本行之间添加空行很有-------------

sscanf函数

Sscanf 函数 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: Int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); int scanf( const char *format [,argument]... ); 说明: sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。 其中的format可以是一个或多个{%[*] [width] [size]type | ' ' | '\t' | '\n' | 非%符号} 注: 1、* 亦可用于格式中, (即%*d 和%*s) 加了星号(*) 表示跳过此数据不读入. (也就是不把此数据读入参数中) 2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。 3、width表示读取宽度。 4、参数的size: 常用的有hh表示单字节size,h表示2字节size,其他详见man sscanf或msdn 5、type :这就很多了,就是%s,%d之类。 控制字符说明 %c 一个单一的字符 %d 一个十进制整数

%i 一个整数 %e, %f, %g 一个浮点数 %o 一个八进制数 %s 一个字符串 %x 一个十六进制数 %p 一个指针 %n 一个等于读取字符数量的整数 %u 一个无符号整数 %[] 一个字符集 %% 一个精度符 6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值 支持集合操作: %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配) %[aB'] 匹配a、B、'中一员,贪婪性 %[^a] 匹配非a的任意字符,贪婪性 还是用例子说话: #include int main() { char buf[512] = {0};

C++ Assert()断言机制原理以及使用

MSDN原文如是说: Evaluates an expression and, when the result is false, prints a diagnostic message and aborts the program. (判断一个表达式,如果结果为假,输出诊断消息并中止程序。)[cpp]view plaincopy print? 1.void assert( 2.int expression 3.); 参数:Expression (including pointers) that evaluates to nonzero or 0.(表达式【包括指针】是非零或零) 原理:assert的作用是现计算表达式expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用abort 来终止程序运行。 MSDN示例程序; [cpp]view plaincopy print? 1.// crt_assert.c 2.// compile with: /c 3.#include 4.#include 5.#include 6. 7.void analyze_string( char *string ); // Prototype 8. 9.int main( void ) 10.{

11.char test1[] = "abc", *test2 = NULL, test3[] = ""; 12. 13. printf ( "Analyzing string '%s'\n", test1 ); fflush( stdout ); 14. analyze_string( test1 ); 15. printf ( "Analyzing string '%s'\n", test2 ); fflush( stdout ); 16. analyze_string( test2 ); 17. printf ( "Analyzing string '%s'\n", test3 ); fflush( stdout ); 18. analyze_string( test3 ); 19.} 20. 21.// Tests a string to see if it is NULL, 22.// empty, or longer than 0 characters. 23.void analyze_string( char * string ) 24.{ 25. assert( string != NULL ); // Cannot be NULL 26. assert( *string != '\0' ); // Cannot be empty 27. assert( strlen( string ) > 2 ); // Length must exceed 2 28.} 输出结果 [cpp]view plaincopy print? 1.Analyzing string 'abc' 2.Analyzing string '(null)' 3.Assertion failed: string != NULL, file assert.cpp, line 25 4. 5.abnormal program termination 用法总结: 1)在函数开始处检验传入参数的合法性 如:

sscanf()用法详细介绍

sscanf()用法详细介绍 1.名称 函数原型: int sscanf( const char *, const char *, ...); int sscanf(const char *buffer,const char *format,[argument ]...); buffer存储的数据 format格式控制字符串 argument 选择性设定字符串 sscanf会从buffer里读进数据,依照format的格式将数据写入到argument里。 2.头文件 #include 3.返回值 成功则返回参数数目,失败则返回-1,错误原因存于errno中。 经多次测试,在linux系统中成功返回的是全部参数值减2,例如: sscanf("1 2 3","%d %d %d",buf1, buf2, buf3); 成功调用返回值为3,即buf的数量(总参数个数减前两个)。 (注意:此处buf均为地址) 4.说明 sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。 第二个参数可以是一个或多个{%[*] [width] [{h | I | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号} 注: 1、* 亦可用于格式中, (即%*d 和%*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中) 2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。 3、width表示读取宽度。 4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节size,L表示4字节size(double例外),l64表示8字节size。 5、type :这就很多了,就是%s,%d之类。 6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值 失败返回0 ,否则返回格式化的参数个数 5.支持集合操作 %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配),在keil mdk中不支持“a-z”这种写法 %[aB'] 匹配a、B、'中一员,贪婪性 %[^a] 匹配非a的任意字符,并且停止读入,贪婪性 6.例子 1.sscanf默认以空格分割字符串。 结果为:123456

SSCANF与STRINGSTREAM函数的用法总结

sscanf与stringstream函数的用法总结 在按tab为分隔符读取文件的时候,遇到了很多问题,c++不像java、C#对字符串游很好的操作,我在查了很多资料,查到了sscanf和stringstream函数,这两个函数对上述问题可以很好的解决。 在读取字符串时,sscanf和stringstream非常强大,尤其是当以某个字符为分隔符读入字符串,并把分割后字符串转换成double或者int时,这两个函数的优势就体现出来,以下是我看了很多资料后,总结的一些用法。 sscanf是一个运行时函数,原形很简单: int sscanf(const char*buffer,const char*format[,argument]...); 它强大的功能体现在对format的支持,以及类型转换上。 其中的format可以是一个或多个{%[*][width][{h|l|I64|L}]type|''|'\t'|'\n'|非%符号}, 注:{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。 width:宽度,一般可以忽略,用法如: const char sourceStr[]="hello,world"; char buf[10]={0}; sscanf(sourceStr,"%5s",buf);//%5s,只取5个字符 cout<

MsgBox函数用法讲解

MsgBox 函数用法讲解
VBA 中 msgbox 的用法小结
1、作用 在消息框中显示信息,并等待用户单击按钮,可返回单击的按钮值(比如“确定” 或者“取消”)。通常用作显示变量值的一种方式。 2、语法 MsgBox(Prompt[,Buttons][,Title][,Helpfile,Context]) 参数说明: (1)Prompt,必需的参数,为字符串,作为显示在消息框中的消息文本。其最大 长度约为 1024 个字符, 由所用字符的宽度决定。 如果 prompt 的内容超过一行, 则可以在每一行之间用回车符(Chr(13))、换行符(Chr(10))或是回车与换行符的 组合(Chr(13)&Chr(10))将各行分隔开来。 (2)Buttons,可选的参数,为数值表达式的值之和,指定显示的按钮的数目及形 式、使用的图标样式、缺省按钮及消息框的强制回应等,可以此定制消息框。若 省略该参数,则其缺省值为 0。设置值见下表。 (3)Title,可选的参数,表示在消息框的标题栏中所显示的文本。若省略该参数, 则将应用程序名放在标题栏中。 (4)Helpfile,可选的参数,为字符串表达式,提供帮助文件。若有 Helpfile,则 必须有 Context。 (5)Context,可选的参数,为数值表达式,提供帮助主题。若有 Context,则必 须有 Helpfile。 3、Button 参数

用于 MsgBox 函数中 Button 参数的常量 常量 vbOKOnly VbOKCancel VbAbortRetryIgnore VbYesNoCancel VbYesNo VbRetryCancel VbCritical VbQuestion VbExclamation VbInformation vbDefaultButton1 vbDefaultButton2 vbDefaultButton3 vbDefaultButton4 vbApplicationModal 消息框 作出响应才继续工作 vbSystemModal 消息框作 出响应才继续工作 4096 系统强制返回; 全部应用程序都被挂起, 直到用户对 4 5 值 0 1 2 3 说明 只显示“确定”按钮 显示“确定”和“取消”按钮 显示“终止”、“重试”和“忽略” 按钮 显示“是”、“否”和“取消”按钮
显示“是”和“否”按钮 显示“重试”和“取消”按钮
16 显示“关键信息”图标 32 显示“警告询问”图标 48 显示“警告消息”图标 64 显示“通知消息”图标 0 第一个按钮是缺省值(缺省设置) 256 第二个按钮是缺省值 512 第三个按钮是缺省值 768 第四个按钮是缺省值 0 应用程序强制返回; 应用程序一直被挂起, 直到用户对

MsgBox函数用法讲解

MsgBox函数用法讲解 VBA中msgbox的用法小结 1、作用 在消息框中显示信息,并等待用户单击按钮,可返回单击的按钮值(比如“确定”或者“取消”)。通常用作显示变量值的一种方式。 2、语法 MsgBox(Prompt[,Buttons][,Title][,Help]) 参数说明: (1)Prompt,必需的参数,为字符串,作为显示在消息框中的消息文本。其最大长度约为1024个字符,由所用字符的宽度决定。如果prompt的内容超过一行,则可以在每一行之间用回车符(Chr(13))、换行符(Chr(10))或就是回车与换行符的组合(Chr(13)&Chr(10))将各行分隔开来。 (2)Buttons,可选的参数,为数值表达式的值之与,指定显示的按钮的数目及形式、使用的图标样式、缺省按钮及消息框的强制回应等,可以此定制消息框。若省略该参数,则其缺省值为0。设置值见下表。 (3)Title,可选的参数,表示在消息框的标题栏中所显示的文本。若省略该参数,则将应用程序名放在标题栏中。 (4)Helpfile,可选的参数,为字符串表达式,提供帮助文件。若有Helpfile,则必须有C ontext。 (5)Context,可选的参数,为数值表达式,提供帮助主题。若有Context,则必须有H elpfile。 3、Button参数 用于MsgBox函数中Button参数的常量

常量值说明 vbOKOnly 0 只显示“确定”按钮 VbOKCancel 1 显示“确定”与“取消”按钮 VbAbortRetryIgnore 2 显示“终止”、“重试”与“忽略” 按钮VbYesNoCancel 3 显示“就是”、“否”与“取消”按钮 VbYesNo 4 显示“就是”与“否”按钮 VbRetryCancel 5 显示“重试”与“取消”按钮 VbCritical 16 显示“关键信息”图标 VbQuestion 32 显示“警告询问”图标 VbExclamation 48 显示“警告消息”图标 VbInformation 64 显示“通知消息”图标 vbDefaultButton1 0 第一个按钮就是缺省值(缺省设置) vbDefaultButton2 256第二个按钮就是缺省值 vbDefaultButton3 512第三个按钮就是缺省值 vbDefaultButton4 768第四个按钮就是缺省值 vbApplicationModal 0应用程序强制返回;应用程序一直被挂起,直到用户对消息框 作出响应才继续工作 vbSystemModal 4096系统强制返回;全部应用程序都被挂起,直到用户对消息框作 出响应才继续工作 vbMsgBoxHelpButton 16384将Help按钮添加到消息框

相关主题