我有一个任务,我需要你的建议
我运行我的程序时有参数,比如
./program.x input.txt output.txt
所以在我的程序中,我检查了我是否正确使用了参数。
if (argc != 3) {
printf("Wrong arguments number\n");
printf("I should run this way:\n");
printf("%s source result\n",argv[0]);
exit(1);
}
if( (wz= fopen(argv[1],"r")) == NULL) {
printf("Open error %s\n", argv[1]);
exit(1);
}
if( (wc= fopen(argv[2],"w")) == NULL) {
printf("Open error %s\n", argv[2]);
exit(2);
}
我也用assert检查文件是否正常,他们告诉我们也要用assert。
assert((wz = fopen(argv[1] ,"r")));
assert((wc = fopen(argv[2] ,"w")));
但我不知道应该先放 assert,还是先检查参数数?
if (argc != 3) {
printf("Wrong arguments number\n");
printf("I should run this way:\n");
printf("%s source result\n",argv[0]);
exit(1);
}
if( (wz= fopen(argv[1],"r")) == NULL) {
printf("Open error %s\n", argv[1]);
exit(1);
}
if( (wc= fopen(argv[2],"w")) == NULL) {
printf("Open error %s\n", argv[2]);
exit(2);
}
assert((wz = fopen(argv[1] ,"r")));
assert((wc = fopen(argv[2] ,"w")));
还是
if (argc != 3) {
printf("Wrong arguments number\n");
printf("I should run this way:\n");
printf("%s source result\n",argv[0]);
exit(1);
}
if( (wz= fopen(argv[1],"r")) == NULL) {
printf("Open error %s\n", argv[1]);
exit(1);
}
if( (wc= fopen(argv[2],"w")) == NULL) {
printf("Open error %s\n", argv[2]);
exit(2);
}
assert((wz = fopen(argv[1] ,"r")));
assert((wc = fopen(argv[2] ,"w")));
if (argc != 3) {
printf("Wrong arguments number\n");
printf("I should run this way:\n");
printf("%s source result\n",argv[0]);
exit(1);
}
if( (wz= fopen(argv[1],"r")) == NULL) {
printf("Open error %s\n", argv[1]);
exit(1);
}
if( (wc= fopen(argv[2],"w")) == NULL) {
printf("Open error %s\n", argv[2]);
exit(2);
}
assert(expression)
是一个宏定义的 #include <assert.h>
.
如果 NDEBUG
宏之前定义了 #include <assert.h>
行,然后调用宏 assert(expression)
扩充为无效表达式 ((void)0)
. 否则,它将向标准错误流写入一个错误信息,并调用 abort()
.
因为 assert(expression)
可能不会产生任何代码,如果是在 expression
有任何副作用。副作用的一个例子是给一个变量(或其他lvalue)赋值。另一个副作用的例子是打开文件。调用 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
在命令行参数上是很有可能失败的,通常应该以对命令行参数有用的方式来处理。用户 的程序,而不是开发者。