nulo terminando una cadena

gcc 4.4.4 c89

¿Cuál es la forma estándar de anular la terminación de una cadena? Cuando uso el NULL recibo un mensaje de advertencia.

 *dest++ = 0; *dest++ = '\0'; *dest++ = NULL; /* Warning: Assignment takes integer from pointer without a cast */ 

Código fuente:

 size_t s_strscpy(char *dest, const char *src, const size_t len) { /* Copy the contents from src to dest */ size_t i = 0; for(i = 0; i < len; i++) *dest++ = *src++; /* Null terminate dest */ *dest++ = 0; return i; } 

Otra pregunta: deliberadamente comenté la línea que null termina. Sin embargo, sigue imprimiendo correctamente los contenidos del dest. La persona que llama a esta función enviaría la longitud de la cadena ya sea que incluya NULL o no. es decir strlen(src) + 1 o stlen(src) .

 size_t s_strscpy(char *dest, const char *src, const size_t len) { /* Copy the contents from src to dest */ size_t i = 0; /* Don't copy the null terminator */ for(i = 0; i < len - 1; i++) *dest++ = *src++; /* Don't add the Null terminator */ /* *dest++ = 0; */ return i; } 

A su primera pregunta: me gustaría ir con el comentario de Paul R y terminar con '\0' . Pero el valor 0 también funciona bien. Una cuestión de gusto. Pero no use el MACRO NULL que es para punteros.

Para su segunda pregunta: si su cadena no termina con \0 , aún puede imprimir el resultado esperado porque al seguir su cadena hay un carácter no imprimible en su memoria. Sin embargo, este es un error realmente desagradable, ya que podría explotar cuando no se lo espera. Siempre termina una cadena con '\0' .

De las preguntas frecuentes comp.lang.c: http://c-faq.com/null/varieties.html

En esencia: NULL (la macro del preprocesador para el puntero nulo) no es lo mismo que NUL (el carácter nulo).

Tenga mucho cuidado: NULL es una macro utilizada principalmente para punteros. La forma estándar de terminar una cadena es:

 char *buffer; ... buffer[end_position] = '\0'; 

Esto (abajo) funciona también pero no es una gran diferencia entre asignar un valor entero a una matriz int / corto / largo y asignar un valor de carácter. Esta es la razón por la que se prefiere la primera versión y personalmente me gusta más.

 buffer[end_position] = 0; 

‘\ 0’ es el camino a seguir. Es un personaje, que es lo que se quiere en una cadena y tiene el valor nulo.

Cuando decimos cadena terminada nula en C / C ++, realmente significa ‘cadena terminada en cero’. La macro NULL no está pensada para usarse en la terminación de cadenas.