【问题标题】:Using 'assert' to verify number of arguments使用 'assert' 来验证参数的数量
【发布时间】:2015-07-09 16:45:44
【问题描述】:

我正在为课堂作业做作业,我认为我的程序可以正常运行,但现在我想对其进行一些修改,以便更好地理解 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 -- 但是最后一个命令只算作一个参数,因此断言会触发。如果我将函数更改为&gt;= 1,那么它可以工作。

我的另一个问题是,如何让它在不符合要求时显示错误消息?
我已经尝试过assert("Not the right amount of arguments", argc &gt; 4),但随后我收到一条错误消息,提示传递给 main 的参数过多。

感谢您的帮助,如果我的格式有误,我们深表歉意。第一次发帖。

【问题讨论】:

  • 当有人使用错误的方式时,您的程序不应崩溃。
  • 澄清克里斯的评论:断言的语义基本上是“如果这个表达式不评估为'true',则程序崩溃” - 你可能不想在这里断言。 cplusplus.com/reference/cassert/assertstackoverflow.com/questions/1571340/…
  • This code works, as far as I can tell, but I don't know what 4 commands to pass it? 我们不知道,这是你的程序。您和/或您的教授必须知道该程序的用法。

标签: c++ assert


【解决方案1】:

这是对assert 的完全错误用法。使用assert 说明您作为程序员认为在逻辑上必要的事情。从逻辑上讲,有人可以使用少于 4 个参数来调用您的程序,因此 assert正确的。

assert 的常见用法是在函数的开头。 (这不是验证参数。)考虑int foo(void *k){ assert(k != NULL); ...} 再一次,这不是验证参数k。断言是一个文档,它告诉在调用站点编写代码的人 foo 不能使用 NULL 参数调用。声称在正确编写的代码中,k 为非空是逻辑上的必然。如果要验证参数并生成漂亮的错误消息,请使用 if 语句。

关于assert 的一件事是您应该假设它在正常操作中不执行。通常,程序将使用-DNDEBUG 编译,这会将所有断言转换为空格。

【讨论】:

  • 您好,谢谢您的回答!你说的很有道理,但这是一个基本的安全课程,所以我假设教授知道这一点。以下是他的说明: 第 2 项:编写一个 C++ 程序来断言程序的参数数量大于 4。使用 assert 来实现这一点,如果违反条件则中止。不要在程序中使用任何 if 或 while 语句。平台是 PC 或 unix(您拨打电话)。您可以使用 DeterLab 或任何其他计算机。
  • 你不应该假设你的老师知道任何事情。很多无知经常从教室前面表达出来,而你的教授正在指导你以这种方式使用assert,这是一个很好的指标,表明你应该对所教授的内容保持警惕。
  • 嘿,只是想更新线程。教授希望我们学习断言的基本用法,我猜他不太关心编写一个完全正确的程序。再次感谢您的帮助!
【解决方案2】:

好的,在开始执行任何程序代码之前,应该检查参数的数量。

在这种情况下,我猜教授希望您将传递给程序的参数传递给 ls 。所以它应该类似于

 ./assignment -l -s -a 

在上述情况下,-l -s 和 -a 是参数。

您可以使用 if 条件而不是断言来检查参数的数量。

 if (argc < 4) {
     // print the error message
     // exit from program
 }

查看 william 的回答,了解在这种情况下不使用 assert 的原因

【讨论】:

    【解决方案3】:

    我不知道要传递哪 4 个命令

    这取决于你。你可以这样做:

    ./assignment a b c d
    

    你会得到argv[1]="a"argv[2]="b"等。 解析和使用这些参数取决于您;在这种情况下,您可以尝试找到处理参数的示例。也许以相反的顺序或类似的基本顺序打印它们?


    关于assert():您的用法并不完全正确,正如另一个答案中指出的那样。 要回答您的问题,显示消息的一种简单方法是使用 &amp;&amp;https://stackoverflow.com/a/3692961/2750093

    我不认为你的教授会喜欢这样,所以你可以做一些更天真的事情:

    if (argc <= 4 )
    {
        printf("Not the right amount of arguments\n");
        assert(false); // or return -1;
    }
    

    【讨论】:

      【解决方案4】:

      assert(condition) 使程序崩溃,并显示类似file bar.cc line 123: assertion failure 'condition' 的错误消息。因此,它对用户无用,但对开发人员有用

      使用断言来表达预期(关于某些内部控制变量的状态),这些预期在断言之后的代码中被假定为保持。 不要使用 assert 来检查用户输入(外部控制的变量),而是抛出异常。异常可以被用户捕获,断言不能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-02
        • 2010-10-30
        • 1970-01-01
        • 2020-01-07
        • 2021-09-30
        • 2014-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多