Caracteres e String em C: mudanças entre as edições
(16 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()=== | |||
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()=== | |||
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> | ||
; | ;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). | 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=== | |||
Lê caracter a caracter da entrada. | Lê caracter a caracter da entrada. | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
Linha 95: | Linha 157: | ||
scanf("%c",&ch2); | scanf("%c",&ch2); | ||
printf("Você digitou: '%c' e '%c'", ch1, ch2); | printf("Você digitou: '%c' e '%c'", ch1, ch2); | ||
return(0); | |||
} | } | ||
</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 112: | 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=== | |||
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 130: | 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. No Windows, usa-se a função '''fflush'''. | |||
==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. | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
#include <stdio.h> | #include <stdio.h> | ||
Linha 228: | 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[]); | void Strcat(char s1[], char s2[]); //Protótipo da função | ||
int main () / | int main () //Programa principal para teste | ||
{ | { | ||
char string1[20]="Brasil",string2[20]="2014"; | char string1[20]="Brasil",string2[20]="2014"; | ||
Linha 238: | Linha 233: | ||
return (0); | return (0); | ||
} | } | ||
void Strcat(char s1[], char s2[]) / | 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>== | |||
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 255: | 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 270: | Linha 274: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
;Função strcat(): Recebe como argumento duas strings e | ;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 309: | Linha 314: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
;Função strcpy(): | ;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 317: | Linha 323: | ||
char str1[10] = "Brasil"; | char str1[10] = "Brasil"; | ||
char str2[10]; | char str2[10]; | ||
printf("str2 = %s\n", strcpy(str2, str1)); | |||
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 328: | Linha 340: | ||
---- | ---- | ||
--[[Usuário:Evandro.cantu|Evandro.cantu]] ([[Usuário Discussão:Evandro.cantu|discussão]]) | --[[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
- 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
- ↑ 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)