Caracteres e String em C: mudanças entre as edições

De Wiki Cursos IFPR Foz
Ir para navegaçãoIr para pesquisar
 
(23 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 31: Linha 31:
     return (0);  
     return (0);  
  }
  }
</syntaxhighlight>
===Funções da linguagem C para leitura de caracteres e strings===
Estas funções fazem parte da biblioteca:
<syntaxhighlight lang="c">
#include <stdio.h>
</syntaxhighlight>
;getchar():  Lê o próximo caractere da entrada (teclado) e retorna como um char.
<syntaxhighlight lang="c">
char Ch;
Ch = getchar();
</syntaxhighlight>
;gets(): Lê a entrada até "nova linha" (LF) e substitui por '\0' (NULL).
<syntaxhighlight lang="c">
char string[100];
printf ("Digite uma string: ");
gets (string);
</syntaxhighlight>
:O '''gets''' não checa possibilidade de estouro do espaço reservado na declaração da string, por isto seu uso não é recomendado. Alguns compiladores apresentam ''warning'' ou não permitem seu uso.
;fgets: Lê entrada até "nova linha" (LF). Quando a "nova linha" é lida o caractere '\n' (ASCII 10 LF) é acrescento na string, seguido pela terminação '\0' (NULL). O string lido, portanto, apresenta o caractere '\n' antes do '\0' (NULL).
<syntaxhighlight lang="c">
fgets(string, sizeof(string), stdin);
</syntaxhighlight>
:Exemplo de trecho de código para "limpar" da string lida o caractere '\n' (este código usa a função strlen da biblioteca string.h):
<syntaxhighlight lang="c">
#include <string.h>
char string[100];
int len;
printf("Entre uma palavra: ");
fgets(string, sizeof(string), stdin);
len = strlen(string);
if (string[len - 1] == '\n')
    string[len - 1] = '\0';
</syntaxhighlight>
;scanf: Lê caracter a caracter da entrada. Esta função pode apresentar problemas para leitura de caracteres fornecido pelo usuário em sequência, pois o scanf lê os caracteres da entrada digitados pelo usuário, inclusive os caracteres especiais, como "nova linha" (LF). Portanto, é preferível utilizar a função '''getchar'''.
<syntaxhighlight lang="c">
char Ch;
scanf("%c", &Ch);
</syntaxhighlight>
</syntaxhighlight>


Linha 95: Linha 55:
     char string[100];
     char string[100];
     printf ("Digite uma string: ");
     printf ("Digite uma string: ");
     gets (string);
     gets (string); //Veja alerta e alternativa ao uso da função gets
     printf ("Voce digitou %s\n",string);
     printf ("Voce digitou %s\n",string);
     return (0);  
     return (0);  
Linha 109: Linha 69:
   int i;
   int i;
   printf ("Digite uma string: ");
   printf ("Digite uma string: ");
   gets (string);
   gets (string); //Veja alerta e alternativa ao uso da função gets
   for (i=0; string[i] != '\0'; i++)
   for (i=0; string[i] != '\0'; i++)
     printf ("Caractere %d: %c\n", i, string[i]);
     printf ("Caractere %d: %c\n", i, string[i]);
Linha 135: Linha 95:
</syntaxhighlight>
</syntaxhighlight>


===Operações sobre Strings===
==Funções da linguagem C para leitura de caracteres e strings==


Funções que implementam operações primitivas sobre strings, conforme apresentado em <ref name="TENENBAUM">TENENBAUM, Aaron M.; LANGSAM, Yedidyah; AUGENSTEIN, Moshe. '''Estruturas de dados usando C'''. Makron Books, 1995.</ref>.
Estas funções fazem parte da biblioteca:
<syntaxhighlight lang="c">
#include <stdio.h>
</syntaxhighlight>
 
===getchar()===
Lê o próximo caractere da entrada (teclado) e retorna como um char.
<syntaxhighlight lang="c">
char Ch;
Ch = getchar();
</syntaxhighlight>
 
===gets()===
Lê a entrada até "nova linha" (LF) e substitui por '\0' (NULL).
<syntaxhighlight lang="c">
char string[100];
printf ("Digite uma string: ");
gets (string);
</syntaxhighlight>
 
;Alerta: O '''gets''' não checa possibilidade de estouro do espaço reservado na declaração da string, por isto seu uso não é recomendado. Alguns compiladores apresentam ''warning'' ou não permitem seu uso. Uma alternativa para o '''gets''' é a função '''fgets''', que checa o número de bytes lidos da entrada.
 
===fgets===
Lê entrada até "nova linha" (LF). Quando a "nova linha" é lida o caractere '\n' (ASCII 10 LF) é acrescento na string, seguido pela terminação '\0' (NULL).
<syntaxhighlight lang="c">
fgets(string, sizeof(string), stdin);
</syntaxhighlight>
;Atenção: Note que a string lida pelo '''fgets''' apresenta um caractere a mais, o '\n' (ASCII 10 LF), antes do '\0' (NULL).
 
:Exemplo de trecho de código para '''limpar da string o caractere '\n'''' (este código usa a função strlen da biblioteca string.h):
<syntaxhighlight lang="c">
#include <string.h>
char string[100];
int len;
printf("Entre uma palavra: ");
fgets(string, sizeof(string), stdin);
len = strlen(string);
if (string[len - 1] == '\n')
    string[len - 1] = '\0';
</syntaxhighlight>
 
===scanf===
Lê caracter a caracter da entrada.  
<syntaxhighlight lang="c">
char Ch;
scanf("%c", &Ch);
</syntaxhighlight>
 
;Atenção: O '''scanf''' pode apresentar problemas na leitura de caracteres fornecido pelo usuário em sequência. Como '''scanf''' lê os caracteres no buffer de entrada (teclado), quando digitamos um caractere e teclamos Enter, o caractere '\n' vai para o buffer e é lido pelo próximo scanf.  
:Veja exemplo do problema:
<syntaxhighlight lang="c">
#include <stdio.h>
int main()
{
    char ch1, ch2;
    printf("Insira um caractere: ");
    scanf("%c",&ch1);
    printf("Insira outro caractere: ");
    scanf("%c",&ch2);
    printf("Você digitou: '%c' e '%c'", ch1, ch2);
    return(0);
}
</syntaxhighlight>
 
;Soluções para limpar o ''buffer'' de entrada: 1) Na função '''scanf''' insira um espaço entre a '''aspa''' e o símbolo '''%c'''.
<syntaxhighlight lang="c">
#include <stdio.h>
int main()
{
    char ch1, ch2;
    printf("Insira um caractere: ");
    scanf("%c",&ch1);
    printf("Insira outro caractere: ");
    scanf(" %c",&ch2);
    printf("Você digitou: '%c' e '%c'", ch1, ch2);
}
</syntaxhighlight>
 
:2) Limpar o ''buffer'' da entrada com a função '''__fpurge'''.
 
===__fpurge===
A função __fpurge limpa o ''buffer'' de entrada (stdin) e não retorna valor.
<syntaxhighlight lang="c">
#include <stdio.h>
int main()
{
    char ch1, ch2;
    printf("Insira um caractere: ");
    scanf("%c",&ch1);
    __fpurge(stdin);
    printf("Insira outro caractere: ");
    scanf("%c",&ch2);
    printf("Você digitou: '%c' e '%c'", ch1, ch2);
}
</syntaxhighlight>


;Strlen: Função para encontrar o tamanho de uma string.
;Atenção: A função '''__fpurge''' não é padrão, portanto, um código com esta função pode não ser portável para outros sistemas. No Windows, usa-se a função '''fflush'''.


;Strcat: Função para concatenar duas strings
==Operações sobre Strings==
:A função Strcat recebe duas strings como parâmetros e concatenada a segunda string na primeira.


;Exercícios:
Funções que implementam operações primitivas sobre strings, conforme apresentado em <ref name="TENENBAUM">TENENBAUM, Aaron M.; LANGSAM, Yedidyah; AUGENSTEIN, Moshe. '''Estruturas de dados usando C'''. Makron Books, 1995.</ref>.
#Implemente a função '''Strlen'''
#Implemente a função '''Strcat'''


Resoluções:
;Strlen: Função para encontrar o tamanho de uma string.
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
  #include <stdio.h>
  #include <stdio.h>
Linha 171: Linha 222:
</syntaxhighlight>  
</syntaxhighlight>  


;Strcat: Esta função recebe duas strings como parâmetros e concatenada a segunda string na primeira.
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
#include <stdio.h>
#include <stdio.h>
void Strcat(char s1[], char s2[]);       /*Protótipo da função*/
void Strcat(char s1[], char s2[]);     //Protótipo da função
int main ()                            /*Programa principal para teste*/
int main ()                            //Programa principal para teste
{
{
   char string1[20]="Brasil",string2[20]="2014";
   char string1[20]="Brasil",string2[20]="2014";
Linha 181: Linha 233:
   return (0);  
   return (0);  
}
}
void Strcat(char s1[], char s2[])        /*Definição da função*/
void Strcat(char s1[], char s2[])        //Definição da função
{
{
   int i, j;
   int i, j;
   for (i=0; s1[i] != '\0'; i++)
   for (i=0; s1[i] != '\0'; i++)
     ;
     ;
   for (j=0; s2[j] != '\0'; s1[i++]=s2[j++])
   for (j=0; s2[j] != '\0'; i++, j++)    //Veja nota abaixo
    s1[i]=s2[j];
}
</syntaxhighlight>
<syntaxhighlight lang="c">
//O segundo for poderia ser escrito da seguinte forma:
for (j=0; s2[j] != '\0'; s1[i++]=s2[j++])
     ;
     ;
}
//No caso, primeiro é realizada a operação s1[i]=s2[j]
//e depois i e j são incrementados.
</syntaxhighlight>
</syntaxhighlight>


===Biblioteca <string.h>===
==Biblioteca <string.h>==
A biblioteca '''string.h''' da linguagem C apresenta uma série de funções para manipular strings. Para utilizar estas funções deve-se incluir no início do programa a linha:
A biblioteca '''string.h''' da linguagem C apresenta uma série de funções para manipular strings. Para utilizar estas funções deve-se incluir no início do programa a linha:
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Linha 198: Linha 257:


;Função strlen(): Recebe como argumento uma string e retorna um inteiro que é o comprimento do string.
;Função strlen(): Recebe como argumento uma string e retorna um inteiro que é o comprimento do string.
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
#include <stdio.h>
#include <stdio.h>
Linha 213: Linha 274:
</syntaxhighlight>
</syntaxhighlight>


;Função strcat(): Recebe como argumento duas strings e as comcatena.
;Função strcat(): Recebe como argumento duas strings e concatena a segunda string na primeira. Retorna ponteiro para a string concatenada.
 
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
#include <stdio.h>
#include <stdio.h>
Linha 252: Linha 314:
</syntaxhighlight>
</syntaxhighlight>


;Função strcpy(): Copia uma string em outra.
;Função strcpy(): Recebe como argumento duas strings e copia a segunda string na primeira. Retorna ponteiro para a string resultante.
 
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
#include <stdio.h>
#include <stdio.h>
Linha 260: Linha 323:
   char str1[10] = "Brasil";
   char str1[10] = "Brasil";
   char str2[10];
   char str2[10];
  strncpy(str2, str1, 6);
   printf("str2 = %s\n", strcpy(str2, str1));
  str2[7] = '\0';
   printf("str2 = %s\n", str2);
   return (0);  
   return (0);  
}
}
</syntaxhighlight>
</syntaxhighlight>
==Exercícios sobre strings e caracteres==
#Construa uma função que receba uma string e retorne a string escrita de trás para frente.
#Construa uma função para contar a ocorrência de um caractere em uma string.
#Construa uma função que receba as strings do nome completo de uma pessoa na linha de comando (argc e argv) e concatene as strings incluindo espaço entre os nomes.
#Construa uma função que receba uma string e converta seus caracteres para maiúsculo (Pesquise e use a função '''strupr()''' da biblioteca string.h).
#Construa uma função que receba uma string e converta seus caracteres para minúsculo (Pesquise e use a função '''strlwr()''' da biblioteca string.h).
#Modifique a função que recebe as strings do nome completo de uma pessoa, de forma que devolva na forma que os nomes aparecem nas referências bibliográficas da ABNT (ver abaixo).


==Referências==
==Referências==
Linha 271: Linha 340:


----
----
--[[Usuário:Evandro.cantu|Evandro.cantu]] ([[Usuário Discussão:Evandro.cantu|discussão]]) 10h29min de 12 de junho de 2014 (BRT)
--[[Usuário:Evandro.cantu|Evandro.cantu]] ([[Usuário Discussão:Evandro.cantu|discussão]]) 10h33min de 20 de agosto de 2014 (BRT)
----
----


[[Categoria:Estruturas de Dados]]
[[Categoria:Estruturas de Dados]]

Edição atual tal como às 01h27min de 29 de agosto de 2014

Caracteres e String em C

Caracteres

Os caracteres em C são do tipo de dados char e são variáveis de um Byte.

Cada caractere é armazenado no Byte em formato ASCII.

Se armazenarmos um dígito numérico como um char, o conteúdo do char será o código ASCII correspondente ao número, por exemplo:

Dígito: 1 -> ASCII: 00110001
Função para ler e imprimir um caractere digitado
 #include <stdio.h>
 int main ()
 {
   char Ch;
   printf("Digite uma tecla\n");
   Ch = getchar();
   printf ("Voce pressionou a tecla %c\n",Ch);
   return (0); 
 }
Função que imprime código ASCII de um caractere
Como um char armazena um inteiro, se utilizarmos %d na função printf ela irá imprimir o inteiro correspondente ao código ASCII do caractere.
 #include <stdio.h>
 int main ()
 {
    char Ch;
    printf("Digite uma tecla\n");
    Ch = getchar();
    printf ("O código ASCCI da tecla pressionada é %d\n",Ch);
    return (0); 
 }

Strings

As strings em C são vetores de caracteres terminado com um caractere nulo (\0).

O caracter nulo (\0) corresponde ao código ASCII: 00000000.

Como as strings são vetores de caracteres, podemos acessar cada caracter de uma string usando indexação de vetores, no qual o primeiro caractere é indexado por 0, o segundo por 1, e assim por diante.

Uma constante string é indicada por um conjunto de caracteres entre aspas. Por exemplo, a string "Brasil" tem 7 elementos, incluindo as letras da palavra e o caractere \0:

0 1 2 3 4 5 6
B r a s i l \0
Função que lê e imprime uma string digitada
 #include <stdio.h>
 int main ()
 {
    char string[100];
    printf ("Digite uma string: ");
    gets (string); //Veja alerta e alternativa ao uso da função gets
    printf ("Voce digitou %s\n",string);
    return (0); 
 }
Função que percorre o vetor string e imprime cada caractere
 #include <stdio.h>
 int main ()
 {
   char string[100];
   int i;
   printf ("Digite uma string: ");
   gets (string); //Veja alerta e alternativa ao uso da função gets
   for (i=0; string[i] != '\0'; i++)
     printf ("Caractere %d: %c\n", i, string[i]);
   return (0); 
 }
Exercício
Construir uma função para copiar uma string (string1[100]) em outra (string2[100]).

Resolução:

 #include <stdio.h>
 int main ()
 {
   char string1[100], string2[100];
   int i;
   printf ("Digite uma string: ");
   gets (string1);
   for (i=0; string1[i] != '\0'; i++)
     string2[i]=string1[i];
   string2[i]='\0';
   printf ("String copiada: %s\n", string2);
   return (0); 
 }

Funções da linguagem C para leitura de caracteres e strings

Estas funções fazem parte da biblioteca:

 #include <stdio.h>

getchar()

Lê o próximo caractere da entrada (teclado) e retorna como um char.

 char Ch;
 Ch = getchar();

gets()

Lê a entrada até "nova linha" (LF) e substitui por '\0' (NULL).

 char string[100];
 printf ("Digite uma string: ");
 gets (string);
Alerta
O gets não checa possibilidade de estouro do espaço reservado na declaração da string, por isto seu uso não é recomendado. Alguns compiladores apresentam warning ou não permitem seu uso. Uma alternativa para o gets é a função fgets, que checa o número de bytes lidos da entrada.

fgets

Lê entrada até "nova linha" (LF). Quando a "nova linha" é lida o caractere '\n' (ASCII 10 LF) é acrescento na string, seguido pela terminação '\0' (NULL).

 fgets(string, sizeof(string), stdin);
Atenção
Note que a string lida pelo fgets apresenta um caractere a mais, o '\n' (ASCII 10 LF), antes do '\0' (NULL).
Exemplo de trecho de código para limpar da string o caractere '\n' (este código usa a função strlen da biblioteca string.h):
 #include <string.h>
 char string[100];
 int len;
 printf("Entre uma palavra: ");
 fgets(string, sizeof(string), stdin);
 len = strlen(string);
 if (string[len - 1] == '\n')
     string[len - 1] = '\0';

scanf

Lê caracter a caracter da entrada.

 char Ch;
 scanf("%c", &Ch);
Atenção
O scanf pode apresentar problemas na leitura de caracteres fornecido pelo usuário em sequência. Como scanf lê os caracteres no buffer de entrada (teclado), quando digitamos um caractere e teclamos Enter, o caractere '\n' vai para o buffer e é lido pelo próximo scanf.
Veja exemplo do problema:
 #include <stdio.h>
 int main()
 {
    char ch1, ch2;
    printf("Insira um caractere: ");
    scanf("%c",&ch1);
    printf("Insira outro caractere: ");
    scanf("%c",&ch2);
    printf("Você digitou: '%c' e '%c'", ch1, ch2);
    return(0);
 }
Soluções para limpar o buffer de entrada
1) Na função scanf insira um espaço entre a aspa e o símbolo %c.
 #include <stdio.h>
 int main()
 {
    char ch1, ch2;
    printf("Insira um caractere: ");
    scanf("%c",&ch1);
    printf("Insira outro caractere: ");
    scanf(" %c",&ch2);
    printf("Você digitou: '%c' e '%c'", ch1, ch2);
 }
2) Limpar o buffer da entrada com a função __fpurge.

__fpurge

A função __fpurge limpa o buffer de entrada (stdin) e não retorna valor.

 #include <stdio.h>
 int main()
 {
    char ch1, ch2;
    printf("Insira um caractere: ");
    scanf("%c",&ch1);
    __fpurge(stdin);
    printf("Insira outro caractere: ");
    scanf("%c",&ch2);
    printf("Você digitou: '%c' e '%c'", ch1, ch2);
 }
Atenção
A função __fpurge não é padrão, portanto, um código com esta função pode não ser portável para outros sistemas. No Windows, usa-se a função fflush.

Operações sobre Strings

Funções que implementam operações primitivas sobre strings, conforme apresentado em [1].

Strlen
Função para encontrar o tamanho de uma string.
 #include <stdio.h>
 int Strlen(char string[]);      /*Protótipo da função*/
 int main ()                    /*Programa principal para teste*/
 {
   char c[50]="Brasil2014";
   int len;
   len = Strlen(c);
   printf("Comprimento da string: %d\n", len);
   return (0); 
 }
 int Strlen(char string[])       /*Definição da função*/
 {
   int i;
   for (i=0; string[i] != '\0'; i++)
      ;
   return (i);
   //Note que ao percorrer a string, i varia de 0 a i-1 até encontrar '\0'.
   //Ao sair do for, i é incrementado uma última vez, fornecendo o tamanho da string corretamente.
 }
Strcat
Esta função recebe duas strings como parâmetros e concatenada a segunda string na primeira.
#include <stdio.h>
void Strcat(char s1[], char s2[]);      //Protótipo da função
int main ()                             //Programa principal para teste
{
  char string1[20]="Brasil",string2[20]="2014";
  Strcat(string1, string2);
  printf("Strings concatenadas: %s\n", string1);
  return (0); 
}
void Strcat(char s1[], char s2[])        //Definição da função
{
  int i, j;
  for (i=0; s1[i] != '\0'; i++)
     ;
  for (j=0; s2[j] != '\0'; i++, j++)     //Veja nota abaixo
     s1[i]=s2[j];
}
 //O segundo for poderia ser escrito da seguinte forma:
 for (j=0; s2[j] != '\0'; s1[i++]=s2[j++])
     ;
 //No caso, primeiro é realizada a operação s1[i]=s2[j]
 //e depois i e j são incrementados.

Biblioteca <string.h>

A biblioteca string.h da linguagem C apresenta uma série de funções para manipular strings. Para utilizar estas funções deve-se incluir no início do programa a linha:

#include <string.h>
Função strlen()
Recebe como argumento uma string e retorna um inteiro que é o comprimento do string.


#include <stdio.h>
#include <string.h>
int main ()
{
  char c[50];
  int len;
  printf("Entre seu nome: ");
  gets(c);
  len = strlen(c);
  printf("Seu nome tem %d caracteres.\n", len);
  return (0); 
}
Função strcat()
Recebe como argumento duas strings e concatena a segunda string na primeira. Retorna ponteiro para a string concatenada.
#include <stdio.h>
#include <string.h>
int main ()
{
   char str[10] = "Brasil";
   strcat(str, "2014");
   printf("Copa do Mundo %s\n", str);
   return (0); 
}
Função strcmp()
Recebe como argumento duas strings e as compara, retornando um inteiro:
  • Se string1 = string2 -> retorna 0;
  • Se string1 < string2 (vem antes no dicionário) -> retorna inteiro negativo (< 0);
  • Se string1 > string2 (vem depois no dicionário) -> retorna inteiro positivo (> 0).
#include <stdio.h>
#include <string.h>
int main()
{
  char palavra1[100], palavra2[100];
  int  resultado;
  printf("Entre com uma palavra: ");
  gets(palavra1);
  printf("Entre outra palavra: ");
  gets(palavra2);
  resultado = strcmp(palavra1, palavra2);
  if (resultado == 0)
    printf("Palavras iguais\n");
  else if (resultado < 0)
    printf("A primeira palavra vem antes no dicionário\n");
  else
    printf("A segunda palavra vem antes no dicionário\n");
  return (0); 
}
Função strcpy()
Recebe como argumento duas strings e copia a segunda string na primeira. Retorna ponteiro para a string resultante.
#include <stdio.h>
#include <string.h>
int main ()
{
   char str1[10] = "Brasil";
   char str2[10];
   printf("str2 = %s\n", strcpy(str2, str1));
   return (0); 
}

Exercícios sobre strings e caracteres

  1. Construa uma função que receba uma string e retorne a string escrita de trás para frente.
  2. Construa uma função para contar a ocorrência de um caractere em uma string.
  3. Construa uma função que receba as strings do nome completo de uma pessoa na linha de comando (argc e argv) e concatene as strings incluindo espaço entre os nomes.
  4. Construa uma função que receba uma string e converta seus caracteres para maiúsculo (Pesquise e use a função strupr() da biblioteca string.h).
  5. Construa uma função que receba uma string e converta seus caracteres para minúsculo (Pesquise e use a função strlwr() da biblioteca string.h).
  6. Modifique a função que recebe as strings do nome completo de uma pessoa, de forma que devolva na forma que os nomes aparecem nas referências bibliográficas da ABNT (ver abaixo).

Referências

  1. TENENBAUM, Aaron M.; LANGSAM, Yedidyah; AUGENSTEIN, Moshe. Estruturas de dados usando C. Makron Books, 1995.

--Evandro.cantu (discussão) 10h33min de 20 de agosto de 2014 (BRT)