1) O documento apresenta conceitos sobre strings em C como vetores de caracteres, terminação com \0 e funções como scanf(), gets(), puts(), strcpy(), strcat(), strcmp() e strlen().
2) São explicados problemas do uso de gets() como overflow e apresentada solução com fgets().
3) São apresentados exercícios para manipulação de strings como copiar, concatenar, comparar tamanho e converter caixa alta/baixa.
1. Programação de
Computadores
Aula 4 e 5
23 e 30/08/2012
Profª Ms. Engª Elaine Cecília Gatto
Unidade 4: Vetores, Matrizes e Strings
Curso de Bacharelado em Engenharia de Computação
Universidade do Sagrado Coração – USC
Bauru/SP
2. STRINGS
• São sequências, conjuntos ou cadeira de caracteres diversos,
sendo representados por aspas;
• Em C não existe um tipo STRING explícito;
• Não é um tipo primitivo da linguagem;
• Não existe uma palavra reservada que declare uma variável do
tipo STRING (como acontece em pascal, java, etc);
• Em C utiliza-se um vetor ou matriz do tipo CHAR para
armazenar uma STRING;
• Mas qual o tamanho da STRING? Quando ela termina?
• Utilizar um caracter terminador: 0 (null = zero) forma que
as funções reconhecem o fim da string;
3. Strings Constantes
• Sempre que o compilador encontra qualquer coisa entre aspas
duplas, ele reconhece que se trata de uma string constante.
Posição da memória string
printf(“%s”, “Saudações”);
1092 S
1093 A
1094 U
1095 D
1096 A
1096 C
1097 O
1098 E
1099 S
1100 0
4. SCANF()
#include <stdio.h> • Observe a saída do
#include <stdlib.h> programa! Consegue
notar o que há de
int main(){
diferente entre a
entrada de dados e a
char nome[100]; saída?
printf("Digite o seu nome: ");
scanf("%s", nome);
printf("Saudacoes, %s", nome);
printf("n ");
system("PAUSE");
return 0;
}
5. SCANF() • Esta instrução lê cada caractere digitado
e os armazena a partir do endereço
nome.
#include <stdio.h> • O processo termina quando um
#include <stdlib.h> caractere branco é encontrado.
• Nesse ponto é incluído automaticamente
o caractere 0 na próxima posição livre.
int main(){ • Não é permitido ultrapassar o limite
char nome[100]; estipulado na criação do vetor/matriz.
• O espaço para 0 deve ser previsto.
printf("Digite o seu nome: ");
• A função scanf() entende um espaço em
scanf("%s", nome); branco como o término da entrada.
printf("Saudacoes, %s", nome); • Por isso, na saída, apenas o primeiro
nome digitado é apresentado.
printf("n ");
system("PAUSE");
return 0;
}
6. SCANF() • Mas se digitarmos o nome inteiro sem
espaços, observe a saída!
• Observe esta instrução novamente.
#include <stdio.h> Porque está sendo usado nome e não
#include <stdlib.h> &nome?
• Neste caso, nome é equivalente a
&nome[0]
int main(){ • O nome de uma matriz é o seu endereço
char nome[100]; inicial
printf("Digite o seu nome: "); • Scanf() é muito utilizada para ler uma
mistura de tipos de dados numa mesma
scanf("%s", nome); instrução.
printf("Saudacoes, %s", nome);
printf("n ");
system("PAUSE");
return 0;
}
7. GETS()
• Usada para leitura de
#include <stdio.h> textos ;
#include <stdlib.h> • Propósito: ler unicamente
uma cadeia de caracteres
int main(){ do teclado enquano a tecla
char nome[100]; ENTER não for pressionada;
printf("Digite o seu nome: "); • Todos os caracteres
digitados são
gets(nome); armazenados, inclusive
printf("Saudacoes, %s", nome); espaços e tabulações;
printf("n "); • O caractere 0 é incluído
system("PAUSE"); no final;
return 0;
}
8. GETS()
#include <stdio.h> • Problemas com esta
#include <stdlib.h> função: pode armazenar
caracteres além da
capacidade definida;
int main(){
char nome[100];
printf("Digite o seu nome: ");
gets(nome);
printf("Saudacoes, %s", nome);
printf("n ");
system("PAUSE");
return 0;
}
9. GETS()
• Neste exemplo, é declarado
#include <stdio.h>
um vetor de tamanho 10, mas
#include <stdlib.h>
o nome digitado contém 20
int main(){
caracteres. Observe que o
char nome[10]; vetor armazena 10 caracters a
printf("Exemplo de estouro de string. n"); mais do que foi especificado.
printf("Digite o seu nome: ");
gets(nome); • Para resolver este problema,
printf("Saudacoes, %s", nome); deve-se usar FGETS()
printf("n ");
system("PAUSE");
return 0;
}
10. FGETS()
#include <stdio.h>
• O código ao lado utiliza fgets.
#include <stdlib.h>
O vetor declarado tem 15
posições e somente essas 15
int main(){ posições são preenchidas.
char nome[15]; • Na saída, observa-se que o
printf("Digite o seu nome: "); nome digitado é maior que as
fgets(nome, 15, stdin); 15 posições, e portanto, o
restante do nome é
printf("Saudacoes, %s", nome);
desprezado.
printf("n ");
system("PAUSE");
return 0;
}
11. PUTS()
#include <stdio.h>
#include <stdlib.h>
int main(){
char nome[80];
printf("Digite o seu nome: ");
gets(nome);
puts("");
puts("Saudacoes, ");
puts(nome); • É o complemento da função
puts(""); gets();
puts("Imprimindo a partir da quarta posicao: ");
puts(&nome[4]); • Propósito: imprimir uma
puts(""); única string por vez;
puts("a funcao puts() pula linha automaticamente!"); • O endereço da string deve ser
puts(""); enviado para putx como
system("PAUSE"); argumento;
return 0;
}
13. Função STRCPY()
• Copia ou atribui o conteúdo da
#include <stdio.h> string de origem para a string de
#include <stdlib.h> destino. Ambas devem ter, no
#include <string.h> mínimo, o mesmo tamanho;
int main(){ • Sintaxe: strcpy(string_destino,
char nome_original[30] ; string_origem);
char nome_copia[30];
printf(" Digite um nome: ");
gets(nome_original);
strcpy(nome_copia, nome_original);
printf(" Nome original: ");
puts(nome_original);
printf(" Nome copia: ");
puts(nome_copia);
system("PAUSE");
return 0;
}
14. Função STRCAT()
#include <stdio.h> • Concatena o conteúdo da string
#include <stdlib.h>
de origem ao final do conteúdo
#include <string.h>
da string de destino.
• Essa função não verifica se a
int main(){ primeira cadeia tem espaço
char cadeia1[100]; suficiente para que a segunda
char cadeia2[10]; cadeia seja adicionada ao seu
printf(" Digite o seu primeiro nome: "); final.
gets(cadeia1); • Sintaxe: strcat(string_destino,
printf(" Digite o seu segundo nome: "); string origem);
gets(cadeia2);
strcat(cadeia1, cadeia2);
printf("%s", cadeia1);
puts("");
system("PAUSE");
return 0;
}
15. Função STRCMP()
#include <stdio.h> • Compara o conteúdo da string
#include <stdlib.h> 1 com o conteúdo da string 2;
#include <string.h>
• Retorna um número inteiro;
int main(){
char string1[20], string2[20];
• Se forem iguais, a função
int resultado; retorna zero;
printf(" Digite uma palavra: ");
gets(string1);
• Se o número retornado for
printf(" Digite uma palavra: "); menor que zero, então a
gets(string2); string1 é menor que a string
resultado = strcmp(string1, string2);
if(resultado ==0 ){
2;
puts("As strings sao iguais."); • Se o número retornado for
}
else{
maior que zero, então a
puts("As strings sao diferentes."); string1 é maior que a string2;
}
system("PAUSE");
return 0;
}
17. Função STRLEN()
#include <stdio.h> • Recebe como argumento o
#include <stdlib.h> endereço de uma string e
#include <string.h> retorna o seu tamanho;
int main(){ • O comprimento do
char string1[20], string2[20]; vetor/matriz da string deve
int tamanho1, tamanho2; ser um a mais que o inteiro
printf(" Digite uma palavra: "); retornado por strlen();
gets(string1); • O terminador 0 não é
printf(" Digite uma palavra: "); contabilizado;
gets(string2);
tamanho1 = strlen(string1);
tamanho2 = strlen(string2);
printf("O tamanho da string1 e: %d", tamanho1);
puts("");
printf("O tamanho da string2 e: %d", tamanho2);
puts("");
system("PAUSE");
return 0;
}
18. Função STRUPR()
#include <stdio.h> • Converte o conteúdo da string
#include <stdlib.h> em letras maiusculas
#include <string.h>
int main(){
char string[20];
printf(" n Escreva uma palavra: ");
gets(string);
printf(" n String original: %s", string);
strupr(string);
printf(" n String convertida: %s", string);
printf("nn");
system("pause");
return 0;
}
19. Função STRLWR()
#include <stdio.h> • Converte o conteúdo da string
#include <stdlib.h> em letras minusculos
#include <string.h>
int main(){
char string[20];
printf(" n Escreva uma palavra com todas
as letras em maiusculo: ");
gets(string);
printf(" n String original: %s", string);
strupr(string);
printf(" n String convertida: %s", string);
printf("nn");
system("pause");
return 0;
}
20. Exercícios
1. Desenvolver um programa que obtenha as seguintes
informações para os “n” colegas da sua turma de
Programação de Computadores:
variavel qtde caracteres
nome 15
sobrenome 30
endereço 80
telefone 10
idade 3
• Realize as seguintes tarefas:
• Copie o nome do seu colega para uma variável denominada
nome2;
• Concatene o sobrenome à variável nome2;
21. Exercícios
• Obtenha o tamanho da variável nome2;
• Imprima todas as informações de cada um dos seus colegas na
tela;
2. Faça um programa em C que leia 10 strings, imprima o
tamanho de cada uma delas e troque as letras para
maiusculas. Dica: use o FOR.
3. Troque as letras do exercício anterior, por minusculas.
4. Escreva um programa em C que receba o nome, a idade e o
sexo de 10 pessoas e armazene, em um vetor/matriz, as
pessoas que forem do sexo masculino e maiores de 18 anos.
22. Exercícios
5. Escreva um programa que faça a seguinte pergunta ao
usuário: “Quem é o criador da Linguagem C?”. O usuário
deve escrever a resposta e o programa deve verificar:
• Se o usuário responder corretamente, uma mensagem de
“parabéns, voce acertou!”, deve ser emitida;
• Se o usuário responder incorretamente, uma mensagem de
“que pena, voce errou!”, deve ser emitida.
6. Se você terminou todos os exercícios acima, então agora,
termine os exercícios de matrizes e vetores das aulas
passadas!