В 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));
Lol не заметил этого, спасибо! – jon2512chua