我正在为class做一个作业,我认为我让程序正常工作,但现在我想对它做一些修改,只是为了更好地理解assert。代码如下-
#include <iostream>
#include <stdlib.h>
#include <assert.h>
using namespace std;
// Sample program that shows how command line arg works, in Unix g++
// Note argc and argv
// Also shows use of system call, that can launch any program
// system launches 'ls' to display files in the dir
void runAssert(int);
int main(int argc, char *argv[])
{
cout << "Number of inputs: " << argc << endl;
cout << "1st argument: " << argv[0] << endl;
system ("ls");
cout << "hello world" << endl;
runAssert(argc);
return 0;
}
void runAssert(int argc)
{
assert(argc > 4);
}
所以程序应该跟踪通过命令行传递给main的参数。教授指定它需要4个参数。这段代码工作,据我所知,但我不知道什么4个命令传递它?我做g++ assignment.cpp -o assignment
然后是./assignment
——但是最后一个命令只算作一个参数,所以assert触发。如果我将函数更改为>= 1
,则它可以工作。
我的另一个问题是,当它不符合要求时,我如何使它显示错误消息?
我已经尝试过assert("Not the right amount of arguments", argc > 4)
,但后来我得到一个错误消息,关于太多的参数被传递到main。
谢谢你的帮助,如果我的格式是错误的,很抱歉。第一次发帖
这是assert
的一个完全错误的用法。使用assert
来陈述你作为一个程序员认为在逻辑上是必要的东西。逻辑上可能有人用少于4个参数调用你的程序,所以assert
是不正确的。assert的常用用法是在函数的开头。(这不是验证参数。)再次考虑int foo(void *k){ assert(k != NULL); ...}
,这是而不是验证参数k
。断言是一段文档,它告诉在调用站点编写代码的人,不能用NULL参数调用foo
。这是一个声明,在正确编写的代码中,k
是非空的逻辑必要性。如果您想验证参数并生成一条漂亮的错误消息,请使用if
语句。
assert
的一件事是,您应该假设它在正常操作中不执行。通常,程序将使用-DNDEBUG
编译,它将把所有断言转换为空白。
ok,在开始执行任何程序代码之前,应该检查参数的数量。
在这种情况下,我猜教授想让你把传递给程序的参数传递给ls,所以应该是类似
的东西 ./assignment -l -s -a
在上面的例子中-l -s和-a是参数。
可以使用if条件来检查参数的数量,而不是assert。
if (argc < 4) {
// print the error message
// exit from program
}
我不知道传递哪4个命令
那由你决定。你可以这样做:
./assignment a b c d
您将获得argv[1]="a"
, argv[2]="b"
等。解析和使用这些参数取决于您;在这种情况下,您可以尝试找到一个处理参数的示例。或者按倒序打印或者其他类似的东西?
关于assert()
:你的用法并不严格正确,正如另一个答案所指出的那样。要回答您的问题,一种显示消息的简单方法是使用&&
: https://stackoverflow.com/a/3692961/2750093
我不认为你的教授会喜欢这样,所以你可以做一些更天真的事情:
if (argc <= 4 )
{
printf("Not the right amount of argumentsn");
assert(false); // or return -1;
}
assert(condition)
使程序崩溃,并显示类似file bar.cc line 123: assertion failure 'condition'
的错误消息。因此,对于用户是没有用的,但是对于开发人员是有用的。
使用assert来表示期望(对某些内部控制变量的状态),这些期望假定在断言之后的代码中立即保持。不要使用 assert来检查用户输入(外部控制的变量),而是抛出异常。异常可以被用户捕获,而断言不能。