8.1
8
EXERCÍCIOS PROPOSTOS – SOLUÇÃO
Usando s Usando ptr Valor
s[2] ou *(s+2) ptr[2] ou *(ptr+2) 'r'
s ou &s[0] ptr
s+1 ou &s[1] ptr+1
(não aplicável) &ptr
8.2
8.3
8.2.1 O operador & (“endereço de”).
8.2.2 O caráter asterisco (*).
8.2.3 Coloca-se entre o tipo para que aponta e o nome da variável.
8.2.4 Um endereço de memória (ou NULL ).
8.2.5 NULL .
8.2.6 Designa-se por “apontado por” e representa-se através de um asterisco (*).
8.2.7 *(&ptr) == ptr
8.2.8 v [0] ou *v
8.2.9 Porque os elementos de qualquer array ocupam sempre posições contíguas de memória.
8.2.10 float **var.
8.3.1 1: #include <stdio.h> 2: #include <string.h> 3: 4: char *my_strrchr(char *str, int ch) /* Versão 1 - Do início para o fim */ 5: { 6: char *ptr = NULL; 7: for (int i=0; str[i]!='\0'; i++) 8: if (str[i]==ch) 9: ptr=&str[i]; // ptr = str+i; 10: 11: return ptr; 12: } 13: 14: char *my_strrchr_alt(char *str, char ch) /* Versão 2 - Do fim para o início */ 15: { 16: char *ptr = str + strlen(str)-1; /* Colocar no último char útil da string */ 17: while (ptr >= str)
18: if (*ptr==ch)
19: return ptr;
20: else
21: ptr--;
22:
23: return NULL;
24: }
25:
26: int main(void)
27: {
28: char nome[100];
29: char *apelido = NULL;
30: printf("Introduza um nome: "); gets(nome); 31:
32: apelido = strrchr(nome, ' ');
33: if (apelido==NULL) /* Não tem apelido. Não existe o espaço */
34: apelido=nome;
35: else
36: apelido++; /* Pois estava a apontar o espaço em branco */
37:
38: printf("Apelido: [%s]\n", apelido);
39: return 0;
40: }
8.3.2
1: #include <stdio.h>
2: #include <string.h>
3: #define MAX_STR 50
4:
5: char *my_strstr(char *str1, char *str2)
6: {
7: int len_search = strlen(str1)-strlen(str2); 8: int len_str2 = strlen(str2);
9:
10: for (int i=0 ; i<=len_search ; i++)
11: if (strncmp(str1+i, str2, len_str2)==0)
12: return str1+i;
13: return NULL;
14: }
15:
16: int main(void)
17: { 18: char str[MAX_STR], search[MAX_STR]; 19: char *ptr_found=NULL;
20:
21: puts(">>> Termine o programa com strings vazias <<<"); 22:
23: while (1)
24: {
25: printf("String principal : "); gets(str); 26: printf("String a procurar: "); gets(search);
27: if (str[0]=='\0' && search[0]=='\0')
28: break;
29:
30: if ((ptr_found=my_strstr(str, search))==NULL)
31: printf("\n\nString não encontrada\n\n");
32: else
33: printf("String [%s] encontrada em [%s]\n\n", search, ptr_found);
34: }
35:
36: return 0;
37: }
PROG0812.C
8.4
8.3.3
char *first_vogal(char *s)
{ const char vogais[] = "aeiou"; for (int i=0 ; s[i]!='\0'; i++) if (strchr(vogais, tolower(s[i]))!=NULL) return s+i; // &s[i]
return NULL; }
8.3.4
1: #include <stdio.h>
2: #include <string.h>
3:
4: char *strrcpy(char *dest, char *orig)
5: { 6: for (int len = strlen(orig); len>=0 ; len--)
7: dest[len]=orig[len];
8: return dest;
9: }
10:
11: char *str_ins(char *dest, char *orig)
12: { 13: strrcpy(dest+strlen(orig), dest);
14: memcpy(dest, orig, strlen(orig)); 15: return dest;
16: }
17:
18: int main(void)
19: {
20: char s[100] = "Gama";
21:
22: str_ins(s, "Beta");
23: printf("%s\n", s); // BetaGama 24:
25: str_ins(s, "Alfa");
26: printf("%s\n", s); // AlfaBetaGama
27:
28: return 0; 29: }
PROG0813.C
Na resolução deste exercício, foi necessário implementar uma função que realize a cópia do final para o início da string , uma vez que ela poderá ter de ser copiada para cima dela própria. Começa-se por copiar a string existente no destino para a posição strlen(orig), pois a string de origem irá ocupar strlen(orig) carateres na string dest . Depois, usa-se a função memcpy, e não a função strcpy, para copiar a string orig para dest , porque a função memcpy não coloca o terminador '\0', que iria apagar o primeiro caráter da string dest anterior, terminando, aí, a string resultado.
8.4.1
pv=v
ppv=&pv;
8.5
8.4.2 v
8.6
8.4.3
A única restrição em relação aos endereços a usar é que todos os elementos do array fiquem em posições contíguas de memória.
1: #include <stdio.h>
2: #include <string.h>
3: 4: int main(void)
5: {
6: int v[5] = {10, 20, 30, 40, 50}; // Array com 5 inteiros
7: int *pv; // Pointer para inteiro
8: int **ppv; // Pointer para Pointer para inteiro
9: 10: pv = v; 11: ppv = &pv;
12: 13: printf("%d %d %d\n", v[0] , *pv , **ppv); 14: printf("%d %d %d\n", v[1] , *(pv+1) , *((*ppv)+1)); 15: printf("%d %d %d\n", v[2] , *(pv+3) , *((*ppv)+4)); 16: printf("%d %d %d\n", v[0]-1 , *(pv+1)-1 , *((*ppv)+2)-1); 17: 18: return 0; 19: }
8.4.4 Colocaria no ecrã, usando os endereços apresentados no Exercício 8.4.2:
100 500 700
char *StrDelUpper(char *s) // ver prog0815.c { char *prim, *ptr; prim = ptr = s; while (*s) /* Equivalente a while (*s!='\0') */ { if (!isupper(*s)) *ptr++=*s; s++; } *ptr='\0'; return prim; }
char *StrDelStr(char *s1, char *s2) // ver prog0815.c { char *loc = strstr(s1, s2); if (loc!=NULL) /* Se s2 existir em s1 */ strcpy(loc, loc+strlen(s2)); return s1; }
8.7
1: #include <stdio.h>
2: #include <string.h>
3: #include <ctype.h>
4:
5: char *StrDelUpper(char *s)
6: { char *prim, *ptr; 7: prim = ptr = s;
8:
9: while (*s) /* Equivalente a while (*s!='\0') */ 10: { if (!isupper(*s))
11: *ptr++=*s; 12: s++; 13: }
14: *ptr='\0'; 15: return prim; 16: } 17:
18:
19: char *StrDelStr(char *s1, char *s2)
20: { 21: char *loc = strstr(s1, s2);
22: if (loc!=NULL) /* Se s2 existir em s1 */ 23: strcpy(loc, loc+strlen(s2)); 24: return s1;
25: }
26:
27: int main(void)
28: { 29:
30: char mix[] = "Alfa_BETA_GaMa?~deltA";
31: char s[] = "O rato roeu a rolha da garrafa de rum do rei da Rússia";
32:
33: printf("Apagar maiúsculas em [%s]\n", mix);
34: printf("[%s]\n\n", StrDelUpper(mix));
35:
36: printf("Apagar [xy]: %s\n", StrDelStr(s, "xy"));
37: printf("Apagar [ra]: %s\n", StrDelStr(s, "ra"));
38:
39: return 0;
40: }
8.7.1 px = &x; py = &y;
8.7.2
8.8
8.7.3 Se se fizer px = py, então:
y 3
py
px
x 2
8.9
char *Second(char *s)
{ if (*s=='\0') return NULL; /* String Vazia */ return strchr(s+1, *s); }
char *Up_Down(char *s)
{ char *ptr=s; while (*ptr!='\0') { if (((ptr-s) %2)==0) /* Se for um índice par */ *ptr = toupper(*ptr); else *ptr = tolower(*ptr); ptr++; } return s; }