我正在为课程分配工作,我认为我的程序正常运行,但现在我想对它进行一些修改,以便更好地理解断言。代码如下 -
#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
- 但是这最后一个命令只计为一个参数,因此断言触发。如果我将函数更改为>= 1
,那么它可以正常工作。
我的另一个问题是,如果不符合要求,如何显示错误信息?
我已经尝试了assert("Not the right amount of arguments", argc > 4)
,但后来我收到一条错误消息,说明有太多的参数传递给main。
感谢您的帮助,对不起我的格式是错误的。第一次发帖。
答案 0 :(得分:5)
这是对assert
的完全错误的使用。使用assert
来陈述您作为程序员认为在逻辑上是必要的事情。从逻辑上讲,某人可以使用少于4个参数调用您的程序,因此assert
不正确。
断言的一个常见用法是在函数的开头。 (这不是验证参数。)考虑int foo(void *k){ assert(k != NULL); ...}
再次,这是不验证参数k
。断言是一段文档,告诉人们在调用站点编写代码,foo
不会使用NULL参数调用。声称在正确编写的代码中,k
非空的逻辑必然性。如果要验证参数并生成漂亮的错误消息,请使用if
语句。
关于assert
的一件事是你应该假设在正常操作中不执行。通常,程序将使用-DNDEBUG
进行编译,这会将所有断言转换为空格。
答案 1 :(得分:0)
我不知道要传递的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 arguments\n");
assert(false); // or return -1;
}
答案 2 :(得分:0)
确定在开始执行任何程序代码之前应检查参数的数量。
在这种情况下,我猜教授希望你把传递给程序的参数传递给 ls 。所以它应该像
./assignment -l -s -a
在上面的例子中,-l -s和-a是参数。
您可以使用if条件来检查参数的数量而不是断言。
if (argc < 4) {
// print the error message
// exit from program
}
检查威廉的答案,了解在这种情况下不使用断言的原因
答案 3 :(得分:0)
assert(condition)
使用file bar.cc line 123: assertion failure 'condition'
等错误消息导致程序崩溃。因此对用户无用,但对开发者非常有用。
使用assert 表示在断言后紧接着代码中假定保留的期望(某些内部控制变量的状态)。 不要使用断言来检查用户输入(外部控制的变量),而是抛出异常。用户可以捕获异常,断言不能。