char text[100]; // 100 carateres máximo
#define MAX_SIZE 100
...
char text[MAX_SIZE];
'\0'
)
"Abba"
é \(\begin{array}{|c|c|c|c|c|c|}\hline \texttt{A}
& \texttt{b} & \texttt{b} & \texttt{a} & \texttt{\0}
\\\hline \end{array}\)'\0'
é um terminador que marca o
final da cadeia
char text[6] = { 'H','e','l','l','o','\0' };
char text[6] = "Hello";
'\0
é automaticamente
introduzido no finalchar text[100] = "Hello";
// os carateres restantes são '\0'
char text[] = "Hello"; // tamanho 6
Para imprimir uma cadeia podemos usar:
puts
;printf
com o formato
"%s"
#include <stdio.h>
char text[] = "Hello, world";
(text); puts
Alternativa:
("%s\n", text); printf
Podemos usar fgets()
para ler cadeias de carateres.
#include <stdio.h>
#define MAX_SIZE 100
...
char text[MAX_SIZE];
(text, MAX_SIZE, stdin); fgets
stdin
é a entrada padrão)Vamos definir pequenas funções para processar cadeias de carateres.
unsigned comprimento(char str[]);
<string.h>
):size_t strlen(char str[]);
size_t
é um inteiro sem sinal (porque o comprimento
nunca é negativo)unsigned comprimento(char str[])
{
unsigned i = 0;
while(str[i] != '\0')
++;
i
return i;
}
unsigned contar_espacos(char str[]);
'\0'
unsigned contar_espacos(char str[])
{
unsigned espacos = 0;
for(int i=0; str[i]!='\0'; i++)
{
if(str[i] == ' ')
++;
espacos }
return espacos;
}
"abc123"
deve ser transformado em
"321cba"
void inverter(char str[]);
inverter
não retorna qualquer valorCuidados:
void inverter(char str[])
{
int i = 0, j;
= comprimento(str) - 1;
j // atenção: j pode ser negativo!
while (i < j) {
char ch = str[i];
[i] = str[j];
str[j] = ch;
str++;
i --;
j }
}
#include <stdio.h>
#define MAX_SIZE 1000 // tamanho máximo
int main(void) {
char text[MAX_SIZE];
(text, MAX_SIZE, stdin); // ler
fgets(text); // imprimir original
puts(text); // inverter
inverter(text); // imprimir invertido
puts}
unsigned comprimento(char str[]);
Contar o número de carateres até ao terminador '\0'
.
Exemplos de uso:
char str1[] = {'A', 'B', '\0'};
char str2[] = "Hello";
= comprimento(str1);
n = comprimento(str2);
m // n igual a 2, m igual a 5
Solução apresentada anteriormente.
unsigned comprimento(char str[]) {
unsigned i = 0;
while(str[i] != '\0')
++;
ireturn i;
}
void copiar(char dest[], char origem[]);
origem
para
dest
dest
dest
tem espaço suficienteExemplo de uso:
char mesg[] = "Hello!!!";
char texto[100];
(texto, mesg);
copiar// agora texto contém "Hello!!!"
void copiar(char dest[], char origem[]) {
int i = 0;
while(origem[i] != '\0') {
[i] = origem[i];
dest++;
i}
[i] = '\0'; // colocar o terminador
dest}
i
é o índice do próximo carater a
copiarvoid copiar(char dest[], char origem[]) {
int i = 0;
while((dest[i]=origem[i]) != '\0')
++;
i}
Note que desta forma o terminador '\0'
é colocado no
teste de condição do ciclo.
void concat(char dest[], char origem[]);
origem
após o final da cadeia
dest
dest
tem espaço suficienteExemplo de uso:
char texto1[50] = "ABC";
char texto2[50] = "1234";
(texto1, texto2);
concat// texto1 fica "ABC1234"
// texto2 continua "1234" (inalterado)
void concat(char dest[], char origem[]) {
int i, j;
= 0;
i = comprimento(dest); // índice do final
j while(origem[i] != '\0') {
[j] = origem[i];
dest++;
i ++;
j }
[j] = '\0'; // colocar o terminador
dest}
void concat(char dest[], char origem[]) {
int i, j;
= 0;
i = comprimento(dest); // índice do final
j while((dest[j]=origem[i]) != '\0') {
++;
i ++;
j }
}
Desta forma colocamos o terminador no teste da condição do ciclo.
int procurar(char str[], char ch);
ch
na cadeiaExemplo de uso:
char msg[] = "ABABCA";
= procurar(msg, 'C');
i = procurar(msg, 'D');
j // i igual a 4, j igual a -1
int procurar(char str[], char ch) {
int i;
for (i = 0; str[i] != '\0'; i++) {
if(str[i] == ch)
return i; // encontrou
}
return -1; // não encontrou
}
int comparar(char str1[], char str2[]);
Exemplo de uso:
char texto1[] = "ABC";
char texto2[] = "ABC123";
= comparar(texto1, texto2);
c // resultado 0 (diferentes)
Note que comparar com ==
não produz o
efeito desejado: compara os endereços das variáveis indexadas,
não os conteúdos:
char texto1[] = "ABC";
char texto2[] = "ABC";
("%d", comparar(texto1, texto2));
printf// imprime 1 (conteúdos iguais)
("%d", texto1 == texto2);
printf// imprime 0 (endereços diferentes)
int comparar(char str1[], char str2[]) {
int i = 0;
while(str1[i] != '\0' && str1[i] == str2[i])
++;
ireturn (str1[i] == str2[i]);
}
O ciclo termina quando:
str1[i] == '\0'
(terminar a 1ª cadeia);str1[i] != str2[i]
(encontrar um carater
diferente).Em qualquer caso: as cadeias são iguais se e só se
str1[i] == str2[i]
.
void imprimir(char str[]);
\n
puts
da biblioteca padrãoputchar
para imprimir um carater de cada vezvoid imprimir(char str[]) {
int i = 0;
while(str[i] != '\0') {
(str[i]);
putchar++;
i}
('\n');
putchar}
int ler_linha(char str[], int max_size);
\n
ou
EOF
str
e terminar com
\0
max_size-1
carateres (por causa do
terminador)Exemplo de uso:
char texto[100];
= ler_linha(texto, 100); n
int ler_linha(char str[], int max_size) {
int i = 0, ch;
--; // máximo carateres a colocar
max_size// subtrai 1 para o terminador
while(max_size > 0) {
= getchar();
ch if(ch == EOF || ch == '\n') // fim?
break;
[i++] = ch;
str--;
max_size}
[i] = '\0'; // coloca terminador
strreturn i; // número de carateres colocado
}