如何使用assert来测试字符串

时间:2010-10-01 08:52:37

标签: c assert

我目前正在尝试测试自己编写的strcat()函数。我没有打印输出并手动逐行检查,而是决定使用assert.h中的assert。问题是即使输出看起来完全正常,断言也会显示错误。以下是我的代码:

void mystrcat_test()
{
    char str[BUFSIZ];
    assert(strcmp(str, ""));
    mystrcat(str, "hello");
    assert(strcmo(str, "hello"));
}

3 个答案:

答案 0 :(得分:6)

当字符串匹配时,

strcmp返回0,因此您的测试需要反转,例如

assert(strcmp(str, "hello") == 0);

答案 1 :(得分:6)

如果两个字符串相同,则

strcmp返回0。 assert取0(false)表示测试失败并报告错误。所以测试应该是:

assert(strcmp(str, "") == 0);

答案 2 :(得分:2)

在C中,如果没有显式设置(自动)变量,它们可以包含任何值,而不仅仅是零,即使它很常见。例如,int(如果未设置)通常为0,但实际上可以是任何值。所有类型都是如此,包括char数组。

在这种情况下,str可能包含任何内容,即它可能不是空的。它没有被初始化,所以你对strcmp的断言“”会打击你。

另外,正如Paul R指出的那样,assert()的逻辑与strcmp()返回的逻辑相反。 0表示strcmp()成功但无法断言()。

这可以写成:

assert(0 == strcmp(str, "hello"));

assert(!strcmp(str, "hello"));

如果你想让它为空,你可以使用静态声明,如下所示:

static char str[BUFSIZ];

但静态变量只有在函数运行时才会被清除。如果你想让str开始为空,你必须每次都清空, 像这样,最有效的方式和最漂亮的方式(如Paul R所说):

char str[BUFSIZE] = "";

相当于:

char str[BUFSIZE] = { 0 };

可以像这样明确地完成:     char str [BUFSIZ];     str [0] ='\ 0';

左右,也许以最合乎逻辑的方式对新来的人:

char str[BUFSIZ];
strcpy(str, "");

左右,明确清除所有数组,效率最低且不必要:

char str[BUFSIZ];
memset(str, 0, sizeof (str));