Strings
Definição
“String” é o nome especial que damos a vetores que armazenam uma sequência de dados do tipo char. Ou seja, é um vetor de caracteres. Utilizamos essa abstração porque a linguagem C não suporta um tipo “string” de maneira nativa como outras linguagens fazem.
Ao inicializar uma string, utilizamos aspas duplas – " ", diferentemente de quando inicializamos uma variável do tipo char, onde utilizamos aspas simples – ' '.
#include <stdio.h>
#include <string.h>
int main() {
char str[6] = "Olá!";
return 0;
}
Sentinela
Ao declarar um vetor de caracteres de, por exemplo, cinco posições, dessas cinco, somente as quatro primeiras estão disponíveis para serem modificadas, pois a última posição obrigatoriamente armazena o caractere nulo ‘\0’, conhecido como “sentinela”, e que serve como um indicativo de que a string chegou ao final. Caso ainda existam posições de memória, anteriormente alocadas, após o sentinela, nelas estarão armazenados lixos de memória.
char str[5] = "Olá!";
printf("Sentinela: %d\n", str[5]);
Manipulando strings
Pode-se acessar as posições de uma string da mesma forma que fazemos com arrays dos demais tipos de dados.
char str2[20] = "Oi de novo!";
for (int i = 0; i < sizeof(str2)/sizeof(str2[0]); i++) {
printf("%c", str2[i]);
}
printf("\n");
Copiando uma string:
Pode-se copiar uma string utilizando ou não a biblioteca <string.h>.
Ao optar por utilizar a função strcpy, da biblioteca <string.h>, é preciso fornecer-lhe dois parâmetros: a string que será copiada e a string que receberá o conteúdo da outra string.
strcpy(char *StringDeDestino, char *StringDeOrigem)
char str3[10] = "maçã", str4[10] = "uva";
for (int i = 0; i < sizeof(str3)/sizeof(str3[0]); i++) {
printf("%c", str3[i]);
}
printf("\n");
for (int i = 0; i < sizeof(str4)/sizeof(str4[0]); i++) {
printf("%c", str4[i]);
}
printf("\n");
for (int i = 0; i < sizeof(str3)/sizeof(str3[0]); i++) {
str4[i] = str3[i];
}
for (int i = 0; i < sizeof(str4)/sizeof(str4[0]); i++) {
printf("%c", str4[i]);
}
printf("\n");
#include <string.h>
char str5[10] = "laranja", str6[10] = "limão";
for (int i = 0; i < sizeof(str5)/sizeof(str5[0]); i++) {
printf("%c", str5[i]);
}
printf("\n");
for (int i = 0; i < sizeof(str6)/sizeof(str6[0]); i++) {
printf("%c", str6[i]);
}
printf("\n");
strcpy(str5, str6);
for (int i = 0; i < sizeof(str6)/sizeof(str6[0]); i++) {
printf("%c", str6[i]);
}
printf("\n");
Lendo uma string: fgets
Podemos, assim como fazemos com os arrays, percorre a string por meio de um loop for, atribuindo valores à suas posições. Contudo, também podemos utilizar a função fgets, que recebe como parâmetros a string em que queremos escrever, seu tamanho, e o meio pelo qual a entrada será fornecida. Por enquanto, utilizaremos o dispositivo de entrada padrão.
fgets(char *string, int tamanhoDaString, stdin)
A função fgets irá ler a string até o que o caractere de nova linha seja lido, ‘\n’, ou até que $n-1$ seja alcançado, pois devemos considerar o sentinela.
#include <string.h>
char str7[20];
int c;
while ((c = getchar()) != '\n' && c != EOF);
fgets(str7, sizeof(str7), stdin);
str7[strcspn(str7, "\n")] = '\0';
printf("A string fornecida foi: \"%s\"\n", str7);
A string fornecida foi: "laranja"
Imprimindo uma string: fputs
Podemos utilizar a função fputs para imprimir uma string no dispositivo de saída padrão.
fputs(char *string, stadout)
#include <string.h>
char str8[20] = "morango";
fputs(str8, stdout);
printf("\n");
Comparando strings
A função strcmp nos permite comparar duas strings. Se elas forem iguais, a função retorna o número 0. Caso contrário, retornará um valor não-nulo qualquer. Ela recebe as duas strings a serem comparadas como parâmetros.
strcmp(char *string1, char *string2)
#include <string.h>
char str9[20] = "oi!";
char str10[20] = "olá!";
char str11[20] = "oi!";
if (strcmp(str9, str10) == 0) {
fputs(str9, stdout);
printf(" == ");
fputs(str10, stdout);
printf("\n");
} else if (strcmp(str9, str11) == 0) {
fputs(str9, stdout);
printf(" == ");
fputs(str11, stdout);
printf("\n");
}
Comprimento de strings
Finalmente, podemos descobrir o tamanho de uma string por meio da função strlen, que recebe somente a string sob análise como parâmetro.
#include <string.h>
char texto[20] = "aaaaaaaaaaaaaaa";
printf("%li\n", strlen(texto));