[英]How to use assert to test for string
我正在嘗試測試我自己編寫的strcat()
函數。 我沒有打印輸出並手動逐行檢查,而是決定使用assert.h中的assert。 問題是即使輸出看起來完全正常,斷言也會顯示錯誤。 以下是我的代碼:
void mystrcat_test()
{
char str[BUFSIZ];
assert(strcmp(str, ""));
mystrcat(str, "hello");
assert(strcmo(str, "hello"));
}
如果兩個字符串相同,則strcmp
返回0。 assert
取0(false)作為測試失敗的指示並報告錯誤。 所以測試應該是:
assert(strcmp(str, "") == 0);
字符串匹配時strcmp
返回0,因此需要反轉測試,例如
assert(strcmp(str, "hello") == 0);
在C中,如果沒有顯式設置if(auto)變量,它們可以包含任何值,而不僅僅是零,即使它很常見。 例如,int(如果未設置)通常為0,但實際上可以是任何值。 所有類型都是如此,包括char數組。
在這種情況下,str可能包含任何內容,即它可能不是空的。 它沒有被初始化,所以你對strcmp的斷言“”會打擊你。
另外,正如Paul R所指出的,assert()的邏輯與strcmp()返回的邏輯相反。 0表示strcmp()成功但是assert()失敗。
這可以寫成:
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';
或許,對於C新手來說,也許是最符合邏輯的方式:
char str[BUFSIZ];
strcpy(str, "");
左右,明確清除所有數組,效率最低且不必要:
char str[BUFSIZ];
memset(str, 0, sizeof (str));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.