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