Strings vs. Vectores de Caracteres

From Wiki**3

Uma string é um vector de caracteres terminado por '\0'. Um vector de caracteres genérico não assume nada sobre o seu conteúdo: em particular, não define caracteres especiais.

A confusão dos dois conceitos é fonte de problemas. Veja-se o seguinte exemplo.

 Ficheiro vecs.c
 
 #include <stdio.h>
 #include <string.h>

 main() {
   char a[] = { 'a', 'b', 'c', '\0' };
   char b[] = "abc";
   printf("%s %d %d\n", a, strlen(a), sizeof(a));
   printf("%s %d %d\n", b, strlen(b), sizeof(b));
   return 0;
 }

Se, no código acima, a parte a vermelho for incluída (terminador), então a e b serão idênticos. Caso contrário, nada garante que a seguir a 'c' (em a) exista um '\0'. Os resultados podem ser surpreendentes... (ver exemplo abaixo).

 Compilação e execução

 prompt% gcc -ansi -pedantic -Wall vecs.c -o vecs
 prompt% ./vecs
 abc@Ôïÿ¿ïÿ¿ØO@ @Ôïÿ¿¨ïÿ¿­@ 33 3
 abc 3 4