如何在C中使用带有fopen的assert

  • 本文关键字:fopen assert c fopen assert
  • 更新时间 :
  • 英文 :


我有一项任务,需要你的建议

我用参数运行程序,比如

./program.x input.txt output.txt

所以在我的程序中,我检查我是否正确使用了参数

if (argc != 3) {                                
printf("Wrong arguments numbern");
printf("I should run this way:n");
printf("%s source resultn",argv[0]);
exit(1);
}
if( (wz= fopen(argv[1],"r")) == NULL) {
printf("Open error %sn", argv[1]);
exit(1);
}
if( (wc= fopen(argv[2],"w")) == NULL) {
printf("Open error %sn", argv[2]);
exit(2);
}

我也用assert来检查文件是否正常,他们告诉我们必须使用assert太

assert((wz = fopen(argv[1] ,"r")));
assert((wc = fopen(argv[2] ,"w")));

但我不知道我应该先断言,还是先检查参数的数量?

if (argc != 3) {                                
printf("Wrong arguments numbern");
printf("I should run this way:n");
printf("%s source resultn",argv[0]);
exit(1);
}
if( (wz= fopen(argv[1],"r")) == NULL) {
printf("Open error %sn", argv[1]);
exit(1);
}
if( (wc= fopen(argv[2],"w")) == NULL) {
printf("Open error %sn", argv[2]);
exit(2);
}
assert((wz = fopen(argv[1] ,"r")));
assert((wc = fopen(argv[2] ,"w")));

if (argc != 3) {                                
printf("Wrong arguments numbern");
printf("I should run this way:n");
printf("%s source resultn",argv[0]);
exit(1);
}
if( (wz= fopen(argv[1],"r")) == NULL) {
printf("Open error %sn", argv[1]);
exit(1);
}
if( (wc= fopen(argv[2],"w")) == NULL) {
printf("Open error %sn", argv[2]);
exit(2);
}
assert((wz = fopen(argv[1] ,"r")));
assert((wc = fopen(argv[2] ,"w")));
if (argc != 3) {                                
printf("Wrong arguments numbern");
printf("I should run this way:n");
printf("%s source resultn",argv[0]);
exit(1);
}
if( (wz= fopen(argv[1],"r")) == NULL) {
printf("Open error %sn", argv[1]);
exit(1);
}
if( (wc= fopen(argv[2],"w")) == NULL) {
printf("Open error %sn", argv[2]);
exit(2);
}

assert(expression)是由#include <assert.h>定义的宏。

如果NDEBUG宏是在#include <assert.h>行之前定义的,则宏调用assert(expression)扩展为空表达式((void)0)。否则,它将向标准错误流写入一条错误消息,并调用abort()

因为assert(expression)可能不会生成任何代码,所以如果expression有任何副作用,就不应该调用它。副作用的一个例子是为变量(或其他左值(赋值。另一个副作用的例子是打开文件。呼叫assert((wz = fopen(argv[1] ,"r")));同时完成这两件事。在这种情况下,使用assert的正确方法是在assert调用之前执行操作,并且只使用assert来检查结果。例如:

wz = fopen(argv[1], "r");
assert(wz != NULL);

表达式wz != NULL没有副作用(假设wz没有用volatile类型限定符声明(,因此是安全的。


OP正在使用assert作为练习的一部分。需要注意的是,assert通常只用于检查预计不会失败的事情,它写入标准错误流的消息旨在帮助开发人员发现代码中的错误。然而,在命令行参数上调用fopen很可能会失败,并且通常应该以对程序的用户而不是开发人员有用的方式进行处理。

相关内容

  • 没有找到相关文章

最新更新