1. Em C, as strings são representadas por vetores de caracteres que incluem sempre o caractere nulo '\0' como finalizador.
2. Existem funções como printf(), scanf() e strlen() para escrever, ler e obter o comprimento de strings.
3. A biblioteca string.h fornece funções como strcpy(), strcat() e strcmp() para copiar, concatenar e comparar strings.
1. Em C, as strings são representadas por vetores de caracteres que incluem sempre o caractere nulo '\0' como finalizador.
2. Existem funções como printf(), scanf() e strlen() para escrever, ler e obter o comprimento de strings.
3. A biblioteca string.h fornece funções como strcpy(), strcat() e strcmp() para copiar, concatenar e comparar strings.
1. Em C, as strings são representadas por vetores de caracteres que incluem sempre o caractere nulo '\0' como finalizador.
2. Existem funções como printf(), scanf() e strlen() para escrever, ler e obter o comprimento de strings.
3. A biblioteca string.h fornece funções como strcpy(), strcat() e strcmp() para copiar, concatenar e comparar strings.
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
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)
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