Nota especial sobre strings de caracteres

Nota especial sobre strings de caracteres
Suponha que você crie os seguintes fragmentos de códigos e os execute:

 Fragment 1
  
 {
      char *s;

      s="hello";
      printf("%s\n",s);  
 }
   
 Fragment 2

 {
      char s[100];
      
      strcpy(s,"hello");
      printf("%s\n",s);  
  } 

Estes dois fragmentos produzem o mesmo resultado, porém seu comportamento interno é bastante diferente. No fragmento 2, você não pode dizer s="hello";. Para entender as diferenças, você precisa entender como funciona a tabela de constantes de strings de caracteres em C.

Quando seu programa é compilado, o compilador cria o arquivo objeto que contém seu código de máquina e uma tabela com todas as constantes de strings declaradas no programa. No fragmento 1, a instrução s="hello"; faz com que s aponte para o endereço da string de caracteres hello na tabela de constantes de string. Como esta string está na tabela de constantes de string, tecnicamente parte do código executável, não pode ser modificada. Você só pode apontar para ela e utilizá-la para leitura.

No fragmento 2, a seqüência hello também existe na tabela de constantes, portanto você pode copiá-la na matriz de caracteres denominada s. Visto que s não é um ponteiro, a instrução s="hello"; não funcionará no fragmento 2. Ele sequer compilará.

Nota especial sobre o uso de seqüências de caracteres com malloc
Suponha que você escreveu o seguinte programa:

  int main()
  {
      char *s;


      s=(char *) malloc (100);
      s="hello";
      free(s);
      return 0;
  } 

Ele compila corretamente, mas indica uma falha de segmentação na linha free ao ser executado. A linha malloc aloca um bloco de memória de 100 bytes e aponta s para ele, porém agora a linha s="hello"; é um problema. Ela está sintaticamente correta, pois s é um ponteiro, mas quando s="hello"; é executado, s aponta para a seqüência na tabela de constante de seqüências e o bloco alocado é deixado órfão. Considerando que s está apontando para a tabela de constante de string, a string de caracteres não pode ser alterada e free falha, pois não consegue desalocar um bloco na região executável.

A codificação correta é a seguinte:

  int main()
  {
      char *s;


      s=(char *) malloc (100);
      strcpy(s,"hello");
      free(s);
      return 0;
  }  

Tente isto
  • Crie um programa que lê em uma seqüência contendo um nome seguido por um espaço, seguido por um sobrenome. Escreva funções para remover espaços em branco no início ou no final. Escreva outra função que retorne o sobrenome;
  • Escreva uma função que converte uma seqüência em maiúsculas;
  • Escreva uma função que obtenha a primeira palavra de uma string de caracteres e retorne o restante da string.

Erros que devem ser evitados na linguagem C
Perder o caractere , o que é fácil se você não for cuidadoso, pode resultar em alguns bugs. Certifique-se de copiar ao copiar as strings de caracteres. Se você criar uma nova string, certifique-se de colocar nela. Se copiar uma string para outra, certifique-se de que a string receptora é suficientemente grande para comportar a string de origem, incluindo . Finalmente, se você apontar um ponteiro de caracteres para alguns caracteres, certifique-se de terminá-los com .