我有一项任务,需要你的建议
我用参数运行程序,比如
./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
很可能会失败,并且通常应该以对程序的用户而不是开发人员有用的方式进行处理。