Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 14

Strings

Em C não existe propriamente o tipo string


Esse tipo de dados é representado por vetores de caracteres
Uma string é um caso particular de array
é unidimensional
os seus elementos são do tipo carácter
Inclui sempre o carácter nulo ‘\0’
como finalizador da própria string
devem ser dimensionadas com um elemento a mais para suportar o ‘\0’
Exemplo: char str[4]=“Ola”; str O l a \0

Uma string constante é uma qualquer série de caracteres delimitada por


aspas
Exemplo: “Ola, Bom Dia!”
Repare-se na diferença entre “string” e ‘carácter’
uma string é um vetor de vários caracteres, sendo o último deles o carácter
nulo
uma string (const.) é delimitada por aspas (“Ola”) – ocupa 4 Bytes em
memória
um carácter é representado entre plicas (‘a’) – ocupa 1 Byte em memória

1 6:31 Programação Imperativa - 2022/23


Inicialização de Strings

A declaração e a inicialização de strings segue a sintaxe usada nos


vetores

É possível inicializar um vetor de caracteres com uma string


constante:
char str[30]= “Ana Rita”; str Ana Rita\0

char str[]= “Ana Rita”; str Ana Rita\0

o terminador ‘\0’ é automaticamente colocado

Ou inicializar a string com um conjunto de elementos


char str[]= {‘A’, ‘n’, ‘a’, ‘ ’, ‘R’, ‘i’, ‘t’, ‘a’, ‘\0’}; str Ana Rita\0

O vetor a seguir declarado não é considerado uma string


char str[]= {‘A’, ‘n’, ‘a’, ‘ ’, ‘R’, ‘i’, ‘t’, ‘a’}; str Ana Rita

2 6:31 Programação Imperativa - 2022/23


Escrita de strings
A escrita é realizada pelas funções:
printf() e puts()
que fazem aparecer no ecrã todos os caracteres até ao ‘\0’, exclusive
Com a função printf() a string pode ser escrita
diretamente:
printf(“Ana Rita”);
ou, tal como qualquer outra variável ou constante, através da string
de formatação:
printf(“Nome: %s.\n”, “Ana Rita”);
usando o especificador de formato “%s”

Enquanto que a função printf() é usada para escrever qualquer


tipo de dados, a função puts() só serve para escrever strings, e
tem a seguinte particularidade
depois de escrita a string faz uma mudança de linha automática
assim, puts(“Ana Rita”); é equivalente a printf(“Ana Rita\n”);

3 6:31 Programação Imperativa - 2022/23


Leitura de strings
A Leitura é realizada pelas funções:
scanf() e gets()
que leem para uma string os caracteres introduzidos através da consola,
e, no fim da leitura, acrescentam automaticamente o ‘\0’

Com a função scanf() a leitura da string é realizada usando o


especificador de formato “%s”
contrariamente ao que acontece com as variáveis de um tipo
elementar, a variável que recebe a string não é precedida de um &
char name[30];
printf(“Nome: “);
scanf(“%s”, name);
apenas lê uma palavra
ou seja, lê até aparecer um <espaço>, um <tab>, ou um <enter>
A função gets() lê frases (várias palavras)
ou seja, não termina a leitura com o aparecimento de um <espaço>
ou de um <tab>
no lugar do ‘\n’, inserido pelo <enter> final, coloca o ‘\0’
4 6:31 Programação Imperativa - 2022/23
Manipulação de strings
O C apresenta algumas limitações no tratamento de arrays
e strings
por exemplo, não é possível atribuir diretamente uma string a
uma variável, usando o operador de atribuição ‘=‘
nem concatenar uma string a outra, usando o operador de
adição ‘+’

Por isso, o C possui uma poderosa biblioteca de funções


que permitem realizar grande parte dessas operações

5 6:31 Programação Imperativa - 2022/23


Funções para tratamento de strings
Fazendo o include da header file <string.h> passamos a dispor de
um conjunto de funções para tratamento de strings:
strlen(s1) Devolve o tamanho da string s1.

strcpy(s1, s2) Copia a string s2 para s1.

strcat(s1, s2) Concatena s2 ao final de s1.

strcmp(s1, s2) Compara a string s1 com s2.

strchr(s1, ch) Devolve o endereço de memória da primeira


ocorrência do carácter ch na string s1.

strstr(s1, s2) Devolve o endereço de memória da primeira


ocorrência da string s2 em s1.

6 6:31 Programação Imperativa - 2022/23


Exemplo de utilização dessas funções
comprimentos: 3 3
As strings são diferentes
#include <stdio.h> bom dia
#include <string.h> Isto é um teste
void main() { i está em dia
char s1[80], s2[80]; to encontrado em: Isto é um teste
printf("Escreva uma string: "); scanf("%s",s1);
printf("Escreva outra string: "); scanf("%s",s2);
printf("comprimentos: %d %d\n",strlen(s1), strlen(s2));
if(strcmp(s1,s2)==0) printf("As strings são iguais\n");
else printf("As strings são diferentes\n");
strcat(s1, “ ”); strcat(s1, s2);
puts(s1);
strcpy(s1, "Isto é um teste\n");
printf(s1);
if(strchr(s2, 'i')!=NULL) printf("i está em %s\n", s2);
if(strstr(s1, "to")!=NULL) printf("to encontrado em: %s",s1);
}
Se em resposta ao pedido pelo programa, o utilizador escrever as strings “bom” e
“dia”, qual deverá ser a saída?

7 6:31 Programação Imperativa - 2022/23


As nossas próprias funções de manipulação de strings

Vamos nós próprios definir essas funções


embora não seja necessário fazê-lo em problemas concretos,
pois elas já existem
trata-se de um excelente exercício
de estudo de strings
e de aperfeiçoamento da escrita de funções
teremos o cuidado de lhes atribuir nomes diferentes

8 6:31 Programação Imperativa - 2022/23


int mystrlen(char s[])
Devolve o número de caracteres existentes na string s

int mystrlen(char s[]) {


int i;
for(i=0; s[i]!='\0'; i++);
return i;
}

9 6:31 Programação Imperativa - 2022/23


char *mystrcpy(char s1[], char s2[])

Copia a string s2 para a string s1

char *mystrcpy(char s1[], char s2[]){


int i;
for(i=0; s2[i]!='\0'; i++)
s1[i]=s2[i];
s1[i]='\0';
return s1;
}
/*Função alternativa*/
char *mystrcpy(char *s1, char *s2){
while(*s1++=*s2++);
return s1;
}
10 6:31 Programação Imperativa - 2022/23
char *mystrchr(char s[], char ch)
Procura o carácter ch na string s
Devolve
o endereço da primeira ocorrência do carácter ch na string s,
ou, se não for encontrado, o endereço nulo (NULL)

char *mystrchr(char s[], char ch){


int i;
for(i=0; s[i]!='\0' && s[i]!=ch; i++);
if(s[i]=='\0')
return NULL;
else
return &s[i];
}

11 6:31 Programação Imperativa - 2022/23


char *mystrcat(char s1[], char s2[])

Coloca uma cópia da string s2 no final da string s1

char *mystrcat(char s1[], char s2[]){


int i, len=mystrlen(s1);
for(i=0; s2[i]!='\0'; i++)
s1[len+i]=s2[i];
s1[len+i]='\0';
return s1;
}

12 6:31 Programação Imperativa - 2022/23


int mystrcmp(char s1[], char s2[])
Compara duas strings, s1 e s2, e devolve um inteiro:
<0 se s1 < s2
0 se s1==s2
>0 se s1 > s2
É como se devolvesse uma “subtração alfabética” s1-s2
int mystrcmp(char s1[], char s2[]) {
int i;
for(i=0; s1[i]==s2[i] && s1[i]!='\0'; i++);
return(s1[i]‐s2[i]);
}

O valor devolvido resulta da subtração do código ASCII dos


caracteres da primeira posição onde s1 e s2 difiram

13 6:31 Programação Imperativa - 2022/23


Exemplo: detetar a maior linha de texto digitada pelo utilizador
#include <stdio.h>
#include <string.h>
#define MAXLIN 1000 /* comp. max. de 1 linha */
/*esta função lê 1 linha de texto para a string s até um max.*/
/*de caracteres igual a lim. Devolve o n. de caract. lidos */
int getline(char s[], int lim){
int c, i;
for(i=0;i<lim‐1 && (c=getchar())!='\n';i++) s[i]=c;
s[i]='\0';
return i;
}
void main(){
int comp, max=0;
char line[MAXLIN], save[MAXLIN];
printf("Insira linhas de texto: \n");
while ((comp=getline(line,MAXLIN))>0)
if (comp>max) { max=comp; strcpy(save, line);}
if (max>0) printf("%s\n", save);
}
14 6:31 Programação Imperativa - 2022/23

Você também pode gostar