使用"断言"验证参数数



我正在为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
 }

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

我不知道传递哪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来检查用户输入(外部控制的变量),而是抛出异常。异常可以被用户捕获,而断言不能。

相关内容

  • 没有找到相关文章

最新更新