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";
n = comprimento(str1);
m = comprimento(str2);
// n igual a 2, m igual a 5
Solução apresentada na aula anterior.
unsigned comprimento(char str[]) {
unsigned i = 0;
while(str[i] != '\0')
i++;
return i;
}
void copiar(char dest[], char origem[]);
origem
para dest
dest
dest
tem espaço suficienteExemplo de uso:
char mesg[] = "Hello!!!";
char texto[100];
copiar(texto, mesg);
// agora texto contém "Hello!!!"
void copiar(char dest[], char origem[]) {
int i = 0;
while(origem[i] != '\0') {
dest[i] = origem[i];
i++;
}
dest[i] = '\0'; // colocar o terminador
}
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";
concat(texto1, texto2);
// texto1 fica "ABC1234"
// texto2 continua "1234" (inalterado)
void concat(char dest[], char origem[]) {
int i, j;
i = 0;
j = comprimento(dest); // índice do final
while(origem[i] != '\0') {
dest[j] = origem[i];
i ++;
j ++;
}
dest[j] = '\0'; // colocar o terminador
}
void concat(char dest[], char origem[]) {
int i, j;
i = 0;
j = comprimento(dest); // índice do final
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";
i = procurar(msg, 'C');
j = procurar(msg, 'D');
// 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";
c = comparar(texto1, texto2);
// 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";
printf("%d", comparar(texto1, texto2));
// imprime 1 (conteúdos iguais)
printf("%d", texto1 == texto2);
// imprime 0 (endereços diferentes)
int comparar(char str1[], char str2[]) {
int i = 0;
while(str1[i] != '\0' && str1[i] == str2[i])
i++;
return (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') {
putchar(str[i]);
i++;
}
putchar('\n');
}
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];
n = ler_linha(texto, 100);
int ler_linha(char str[], int max_size) {
int i = 0, ch;
max_size--; // máximo carateres a colocar
// subtrai 1 para o terminador
while(max_size > 0) {
ch = getchar();
if(ch == EOF || ch == '\n') // fim?
break;
str[i++] = ch;
max_size--;
}
str[i] = '\0'; // coloca terminador
return i; // número de carateres colocado
}