使用 'assert' 验证参数数量

Using 'assert' to verify number of arguments

我正在为 class 做作业,我认为我的程序可以正常工作,但现在我想对其进行一些修改,以便更好地理解断言。代码如下-

#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.

感谢您的帮助,如果我的格式有误,请见谅。第一次发帖。

assert 的用法完全不正确。使用 assert 来陈述您作为程序员认为逻辑上必要的事情。从逻辑上讲,有人可以使用少于 4 个参数调用您的程序,因此 assert 正确。

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

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

I don't know what 4 commands to pass

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

./assignment a b c d

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


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

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

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

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

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

 ./assignment -l -s -a 

在上面的例子中,-l -s 和 -a 是参数。

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

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

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

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

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