Dúvida linguagem C [RESOLVIDO]

1. Dúvida linguagem C [RESOLVIDO]

Mega Nakamura
meganakamura

(usa Ubuntu)

Enviado em 08/01/2013 - 19:36h

Pessoal, estou (tentando) aprender C em casa, e para isso estou lendo uma apostila da UFMG.
Bem, é o seguinte, em um dos exercícios fiquei com uma dúvida quando apenas fiquei trocando uma letra por vez de uma palavra de uma incógnita para a outra.

O códgo está ai:

#include<stdio.h>
int main ()
{
char a[10],b[10],x;
int c;

printf("Digite uma palavra:\n");
gets(a);

for (c=0;c<10;c=c+1)
{
a[c]=x;
x=b[c];
}
printf("%s",b);
return 0;
}

Observem que a condição do for, eu a coloquei assim apenas para que ele ocorra.
O problema é que cara vez que eu o executo, ele dá um resultado diferente e bem esquisito. Alguém sabe o que está acontecendo?


  


2. Re: Dúvida linguagem C [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 08/01/2013 - 20:45h

Ao declarar as variáveis dentro da função (arrays a e b, além de x), o programa abre memória para elas em tempo de execução dentro da pilha do programa. O conteúdo dessa memória é desconhecido a priori, e como você não define alguma coisa para ele explicitamente, esses valores indefinidos serão o que o seu programa vai usar quando você começa a copiar os valores de um lado para o outro, da maneira que fez. A única coisa à qual você atribui valor, que foi aos elementos do array a, você sobrescreve, dentro do loop, com um valor indefinido de x, e depois com valores indefindos dos elementos de b.

Em tempo: nunca use gets(), pois tal função é inerentemente insegura. Prefira fgets().


3. Re: Dúvida linguagem C [RESOLVIDO]

wellington
wellingtonsr

(usa Slackware)

Enviado em 08/01/2013 - 20:47h

meganakamura escreveu:

Pessoal, estou (tentando) aprender C em casa, e para isso estou lendo uma apostila da UFMG.
Bem, é o seguinte, em um dos exercícios fiquei com uma dúvida quando apenas fiquei trocando uma letra por vez de uma palavra de uma incógnita para a outra.

O códgo está ai:

#include<stdio.h>
int main ()
{
char a[10],b[10],x;
int c;

printf("Digite uma palavra:\n");
gets(a);

for (c=0;c<10;c=c+1)
{
a[c]=x;
x=b[c];
}
printf("%s",b);
return 0;
}

Observem que a condição do for, eu a coloquei assim apenas para que ele ocorra.
O problema é que cara vez que eu o executo, ele dá um resultado diferente e bem esquisito. Alguém sabe o que está acontecendo?



Está imprimindo "b" onde nele não tem nehum valor. além de "nullo"




4. Re: Dúvida linguagem C [RESOLVIDO]

???
gokernel

(usa Linux Mint)

Enviado em 08/01/2013 - 21:26h

o "paulo" acima já falou tudo que vc precisa saber ...

observe que vc não definiu a "string" ( b ) e principalmente o final como zero.


5. Re: Dúvida linguagem C [RESOLVIDO]

Mega Nakamura
meganakamura

(usa Ubuntu)

Enviado em 09/01/2013 - 12:02h

gokernel escreveu:

o "paulo" acima já falou tudo que vc precisa saber ...

observe que vc não definiu a "string" ( b ) e principalmente o final como zero.


Sim, eu defini sim. Dê mais uma olhada.


6. Re: Dúvida linguagem C [RESOLVIDO]

Mega Nakamura
meganakamura

(usa Ubuntu)

Enviado em 09/01/2013 - 12:17h

paulo1205 escreveu:

Ao declarar as variáveis dentro da função (arrays a e b, além de x), o programa abre memória para elas em tempo de execução dentro da pilha do programa. O conteúdo dessa memória é desconhecido a priori, e como você não define alguma coisa para ele explicitamente, esses valores indefinidos serão o que o seu programa vai usar quando você começa a copiar os valores de um lado para o outro, da maneira que fez. A única coisa à qual você atribui valor, que foi aos elementos do array a, você sobrescreve, dentro do loop, com um valor indefinido de x, e depois com valores indefindos dos elementos de b.

Em tempo: nunca use gets(), pois tal função é inerentemente insegura. Prefira fgets().


Paulo, não entendi muito bem. Mas esse valor que será passado de uma variável para a outra tem um valor definido pelo usuário. Por exemplo: se eu digitar carro, o programa vai para o loop e passa letra por letra para a variável x e depois para a b, até que a palavra será formada de novo, mas agora armazenada pela b.
Se eu estiver falando besteira me corrija, mas pelo o que eu (acho) que fiz o valor nunca será nulo a não ser nos espaços que não tem caracteres (carro00000).

E esse fgets, é de qual include?


7. Re: Dúvida linguagem C [RESOLVIDO]

???
gokernel

(usa Linux Mint)

Enviado em 09/01/2013 - 14:20h

repito: vc não definiu ( atribuir um valor ) a "string" ( b ) ... apenas fez a declaração.

seu código é muito pequeno e mesmo assim não encontrei o local que vc falou .

poderia me mostrar em que linha vc acha que definiu( atribuiu o valor ) para a "string" ( b ) ???


8. Re: Dúvida linguagem C [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/01/2013 - 01:13h

Vou reproduzir o seu código, enchendo-o de comentários, para você entender o que acontece.

Antes, porém uma explicação para você a respeito das variáveis que você declarou. As quatro variáveis (os arrays a e b e as variáveis simples x e c) foram declaradas dentro do bloco (trecho de programa compreendido entre chaves "{" e "}") correspondente ao corpo da função main(), o que significa que elas só são visíveis dentro desse bloco. Além disso, como essas declarações não incluem a palavra-chave static, essas variáveis têm alocação automática, o que significa duas coisas: (1) que o compilador não reserva espaço para elas durante a compilação, mas tão somente gera instruções no código executável para que se abra espaço para elas em memória no momento em que o programa for executado, a cada vez que fluxo de execução passar pelo bloco no qual elas foram declaradas, e (2) que esse espaço será liberado quando acabar a execução desse bloco. Diferentemente do que acontecer para variáveis estáticas, o compilador C não dá qualquer garantia sobre o valor inicial de variáveis automáticas, a não ser que você especifique explicitamente tais valores no corpo do programa.

#include<stdio.h>

int main ()
{
/*
Neste ponto, você acabou de entrar na função main().
Ainda não foi aberto espaço na memória para as suas variáveis.
*/
char a[10],b[10],x;
int c;
/*
Neste ponto, o compilador já executou as instruções que reservam
uma área para seus dois arrays e suas duas outras variáveis, mas
ele apenas RESERVOU esse espaço, sem colocar coisa alguma dentro
dele nem se preocupar com o que pudesse haver antes.
*/

printf("Digite uma palavra:\n");
gets(a);
/*
Neste ponto (se o usuário não tiver sido maldoso e digitado mais
do que nove caracteres antes de apertar <Enter>) os elementos do
array 'a' terão recebido os valores correspondentes aos caracteres
digitados pelo usuário, mas os valores dos elementos de 'b', de
'x' e de 'c' ainda não são conhecidos.
*/

/*
No loop abaixo, c recebe sucessivamente, a cada iteração, os
valores de 0 a 9.
*/
for (c=0;c<10;c=c+1)
{
a[c]=x; /* Aqui você diz que o (c+1)-ésimo (digo 'c+1' porque o 1º
elemento tem índice 0, o 2º tem índice 1, e assim por
diante) de 'a' recebe o valor de 'x', mas qual o valor
de 'x' na primeira iteração, se em nenhum outro ponto
do programa executado até agora se atribuiu um valor
a 'x'?
*/
x=b[c]; /* Aqui você atribui um valor a 'x', tomado do (c+1)-ésimo
de 'b'. Só que -- pare para pensar -- nenhum elemento
de 'b' até agora tem um valor conhecido, porque 'b' não
recebeu nenhuma informação depois de ter tido espaço
automaticamente reservado para si, de modo que o valor
de 'x' só é trocado de algo desconhecido para outra
coisa também desconhecida!
*/
}
/*
Na prática, o que o loop acima faz é copiar os valores desconhecidos
de todos os elementos de 'b' por cima de o que quer que 'a' tenha
recebido com a execução de "gets(a)".
*/

/*
A impressão abaixo vai imprimir uma sequência imprevisível de
caracteres correspondente aos valores desconhecidos dos elementos
não-inicializados de 'b'. Com um pouco de "sorte", o programa pode
até travar, dar falha de segmentação ou outro sintoma "divertido",
caso não exista nenhum byte com valor nulo do início da região de
memória alocada automaticamente para 'b' até o final do segmento de
memória ocupado pela pilha do programa.
*/
printf("%s",b);

/*
Antes de sair do corpo da função haverá código para liberar a
memória que foi automaticamente reservada para 'a', 'b', 'x' e
'c'.
*/
return 0;
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts