我目前正在尝试测试自己编写的strcat()
函数。我没有打印输出并手动逐行检查,而是决定使用assert.h中的assert。问题是即使输出看起来完全正常,断言也会显示错误。以下是我的代码:
void mystrcat_test()
{
char str[BUFSIZ];
assert(strcmp(str, ""));
mystrcat(str, "hello");
assert(strcmo(str, "hello"));
}
答案 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));