2010-10-01 2 views
4

Я сейчас пытаюсь проверить функцию strcat(), которую я написал сам. Вместо того, чтобы печатать выходы и проверять их по строкам вручную, я решил использовать assert из assert.h. Проблема в том, что assert показывает ошибки, даже если результаты выглядят совершенно нормально. Ниже мой код:Как использовать assert для проверки строки

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

ответ

5

strcmp возвращает 0, если обе строки одинаковы. assert принимает 0 (false) как указание на то, что тест завершился неудачно и сообщит об ошибке. Таким образом, тест должен быть:

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

Lol не заметил этого, спасибо! – jon2512chua

2

В C, если (авто) переменные не заданы явным образом, они могут содержать любое значение, а не только к нулю, даже если он является общим. Например, int int часто бывает 0, если не задан, но может фактически быть любым значением. То же самое касается всех типов, включая массивы символов.

В этом случае str может содержать что угодно, то есть оно может быть пустым. Он не инициализирован, поэтому ваше утверждение для strcmp с «» может поразить вас.

Кроме того, как указал Павел Р., логика assert() обратна тому, что возвращает strcmp(). 0 означает успех для strcmp(), но отказ assert().

Это вместо того, чтобы можно записать в виде:

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

или

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

Если вы хотите, чтобы это было пусто, вы можете использовать статическую декларацию, например, так:

static char str[BUFSIZ]; 

Но статические переменные очищаются только от первой функции. Если вы хотите, ул начать пустой, вы должны опустошить явно каждый раз, , как это так, самый эффективный способ и симпатичным способом (Как отметил Павел 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)); 
+1

Вероятно, лучше стиль просто использовать 'Обл символ [BUFSIZ] =«»;' –

+0

Извините, если я быть тупым, но не начальное значение по умолчанию для строки в C если вы не инициализируете его как «\ 0», например, как у int будет 0? Также я попытался использовать статическое объявление, а также присвоить значение «NULL» первому элементу, но все же утверждение не выполняется. – jon2512chua

+1

@ jon2512chua, нет, нет начального значения для автоматических переменных в C. Для глобальных значений и статических значений начальные значения равны 0. –

4

strcmp возвращает 0, когда строки соответствуют, поэтому ваши тесты должны быть инвертированы, например

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

+0

Эй, извините, не видел ваш ответ раньше, но спасибо за вашу помощь! :) – jon2512chua

Смежные вопросы