使用'断言'验证参数的数量

时间:2015-07-09 16:45:45

标签: c++ 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 - 但是这最后一个命令只计为一个参数,因此断言触发。如果我将函数更改为>= 1,那么它可以正常工作。

我的另一个问题是,如果不符合要求,如何显示错误信息?
我已经尝试了assert("Not the right amount of arguments", argc > 4),但后来我收到一条错误消息,说明有太多的参数传递给main。

感谢您的帮助,对不起我的格式是错误的。第一次发帖。

4 个答案:

答案 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 表示在断言后紧接着代码中假定保留的期望(某些内部控制变量的状态)。 不要使用断言来检查用户输入(外部控制的变量),而是抛出异常。用户可以捕获异常,断言不能。