O programa a seguir não funciona. Explique detalhadamente qual o problema.
#include <cc50.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
int
main(void)
{
printf("Escreva algo: ");
char* s = GetString();
if (s == NULL)
return 1;
char* w = s;
printf("Capitalizando a cópia...\n");
if (strlen(w) > 0)
w[0] = toupper(w[0]);
printf("Original: %s\n", s);
printf("Cópia: %s\n", w);
return 0;
}
#include <cc50.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
int
main(void)
{
printf("Escreva algo: ");
char* s = GetString();
if (s == NULL)
return 1;
char* w = s;
printf("Capitalizando a cópia...\n");
if (strlen(w) > 0)
w[0] = toupper(w[0]);
printf("Original: %s\n", s);
printf("Cópia: %s\n", w);
return 0;
}
Passo 1
Resumo do que o programa faz: ele chama
GetString()
para ler uma string do usuário, tenta criar uma “cópia” atribuindochar *w \(=\) s;
e então faz
if (strlen(w) > \(0\))
w[\(0\)] \(=\) toupper(w[\(0\)]);
para capitalizar a primeira letra de
w
. Por fim, imprime s
e w
.Passo 2
Analisando a linha
char *w \(=\) s;
ela apenas copia o ponteiro: tanto
s
quanto w
passam a apontar para o mesmo buffer em memória. Não há alocação nem duplicação de conteúdo, só um segundo nome para o mesmo bloco de memória.Passo 3
Quando o código faz
w[\(0\)] \(=\) toupper(w[\(0\)]);
ele está modificando o conteúdo do buffer apontado por
w
— mas esse buffer é exatamente o de s
. Ou seja, não existe “original” e “cópia” independentes: qualquer alteração em w
reflete em s
porque ambos compartilham o mesmo bloco de memória.Passo 4
Para criar realmente uma cópia da string, seria necessário alocar memória e copiar o conteúdo, por exemplo:
char *w \(=\) strdup(s); // em vez de char *w \(=\) s;
ou então usar
malloc
e strcpy
:char *w \(=\) malloc(strlen(s) \(+1\));
if (w !\(=\) NULL)
strcpy(w, s);
Assim
w
e s
apontam para buffers distintos, e você pode alterar w[\(0\)]
sem afetar s[\(0\)]
.Resposta
O problema é que
char *w \(=\) s;
não faz uma cópia da string, apenas copia o ponteiro. Logo s
e w
apontam para o mesmo buffer, e modificar um altera o outro.