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

De Wiki Cursos IFPR Foz
Ir para navegaçãoIr para pesquisar
 
(14 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 33: Linha 33:
</syntaxhighlight>
</syntaxhighlight>


===Funções da linguagem C para leitura de caracteres e strings===
==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: <tt>00000000</tt>.
 
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:
{| border=1
|-
| 0 || 1 || 2 || 3 || 4 || 5 || 6
|-
| B || r || a || s || i || l || \0
|-
|}
 
;Função que lê e imprime uma string digitada:
<syntaxhighlight lang="c">
#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);
}
</syntaxhighlight>
 
;Função que percorre o vetor string e imprime cada caractere:
<syntaxhighlight lang="c">
#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);
}
</syntaxhighlight>
 
;Exercício: Construir uma função para copiar uma string (string1[100]) em outra (string2[100]).
 
Resolução:
<syntaxhighlight lang="c">
#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);
}
</syntaxhighlight>
 
==Funções da linguagem C para leitura de caracteres e strings==


Estas funções fazem parte da biblioteca:
Estas funções fazem parte da biblioteca:
Linha 40: Linha 102:
</syntaxhighlight>
</syntaxhighlight>


====getchar()====
===getchar()===
Lê o próximo caractere da entrada (teclado) e retorna como um char.
Lê o próximo caractere da entrada (teclado) e retorna como um char.
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Linha 47: Linha 109:
</syntaxhighlight>
</syntaxhighlight>


====gets()====
===gets()===
Lê a entrada até "nova linha" (LF) e substitui por '\0' (NULL).  
Lê a entrada até "nova linha" (LF) e substitui por '\0' (NULL).  
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Linha 55: Linha 117:
</syntaxhighlight>
</syntaxhighlight>


;Atenção: 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.
;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====
===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).  
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">
<syntaxhighlight lang="c">
Linha 76: Linha 138:
</syntaxhighlight>
</syntaxhighlight>


====scanf====
===scanf===
Lê caracter a caracter da entrada.  
Lê caracter a caracter da entrada.  
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Linha 99: Linha 161:
</syntaxhighlight>
</syntaxhighlight>


;Soluções: 1) Na função '''scanf''' insira um espaço entre a '''aspa''' e o símbolo '''%c'''.
;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">
<syntaxhighlight lang="c">
  #include <stdio.h>
  #include <stdio.h>
Linha 113: Linha 175:
</syntaxhighlight>
</syntaxhighlight>


:2) Limpar o buffer da entrada com a função '''__fpurge'''.
:2) Limpar o ''buffer'' da entrada com a função '''__fpurge'''.


====__fpurge====
===__fpurge===
A função __fpurge limpa o buffer de entrada (stdin) e não retorna valor.
A função __fpurge limpa o ''buffer'' de entrada (stdin) e não retorna valor.
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
  #include <stdio.h>
  #include <stdio.h>
Linha 131: Linha 193:
</syntaxhighlight>
</syntaxhighlight>


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


Resolução:
==Operações sobre Strings==
<syntaxhighlight lang="c">
#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);
}
</syntaxhighlight>
 
===Operações sobre 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>.
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>.


;Strlen: Função para encontrar o tamanho de uma string.
;Strlen: Função para encontrar o tamanho de uma string.
;Strcat: Função para concatenar duas strings
:A função Strcat recebe duas strings como parâmetros e concatenada a segunda string na primeira.
;Exercícios:
#Implemente a função '''Strlen'''
#Implemente a função '''Strcat'''
Resoluções:
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
  #include <stdio.h>
  #include <stdio.h>
Linha 231: 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 241: 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 258: 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 273: 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 312: 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 320: 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 331: 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)