簡體   English   中英

如何使用assert來測試字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM