Jump to content
AJBM

[Resolvido] Apontadores e Strings

Recommended Posts

AJBM

Boas!

Eu tenho o seguinte código.

char *copia(char *dest, char *ori) {
char *tmp = dest;
while (*dest++ = *ori++);
return tmp;
}
int main(int argc, char** argv) {
char name[] = "Nome";
char tmp[4];
copia(tmp, name);
printf("%s", tmp);
return (EXIT_SUCCESS);
}

A minha duvida é como é que o apontador ori sabe onde é o fim do vector nome?

Share this post


Link to post
Share on other sites
pikax

esse codigo e' inseguro, por causa do buffer overflow.

Em C o final de um array de caracteres e' o '\0' e apos isso normalmente e' seguido por um NULL, em C um NULL e' considerado um 0, while(0) e' falso, por isso sai do ciclo.

EDIT: o \0 e' um NULL

Edited by pikax

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
AJBM

ok.

EDIT: o \0 e' um NULL

Tens a certeza?

o NULL representa o endereço de memoria nº zero , e '\0' representa o carácter cujo o código ASCII é 0.

Penso que são coisas diferentes.

Share this post


Link to post
Share on other sites
pikax

Tens a certeza?

o NULL representa o endereço de memoria nº zero , e '\0' representa o carácter cujo o código ASCII é 0.

Penso que são coisas diferentes.

Sim, o NULL em C e' 0, o \0 e' diferente ao caracter 0!

mas ve por ti proprio:

#include<stdio.h>
int main()
{
 if('0'=='\0')
printf("iguais");
 else
printf("diferentes");
}

EDIT: http://ideone.com/fpCTJI

Edited by pikax

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
pikax

Em C os caracteres sao tratados como numeros, e' por isso que: '9'-'0' = 9

O valor 0 da tabela ASCI e' o 0 num inteiro, o NULL e' uma macro do 0... e' por isso que C++ adicionou a keyword nullptr devido que o 0 nao devera' ser considerado NULL, mas isso e' em C++


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
AJBM

acho que o AJBM não se referiu ao '0' - ascii 48, mas sim ao ASCII 0

Exato.

O que eu queria dizer e´que o null representa um endereço de memoria 0, e o \0 representa o valor 0, os valores são iguais mas significam coisas diferentes.

Share this post


Link to post
Share on other sites
nelsonr

Em C os caracteres sao tratados como numeros, e' por isso que: '9'-'0' = 9

O valor 0 da tabela ASCI e' o 0 num inteiro, o NULL e' uma macro do 0... e' por isso que C++ adicionou a keyword nullptr devido que o 0 nao devera' ser considerado NULL, mas isso e' em C++

Sim eu sei, mas estava-me a referir ao teu exemplo, que usas o '0' - ascii 48 no teste sobre o que o AJBM disse, mas ele nunca se referiu a esse caracter

Edited by nelsonr

Share this post


Link to post
Share on other sites
pikax

Sim eu sei, mas estava-me a referir ao teu exemplo, que usas o '0' - ascii 48 no teste sobre o que o AJBM disse, mas ele nunca se referiu a esse caracter

abre o exemplo do IDEone, tem la' esta linha de codigo:

printf("\n%s",NULL==0?"null==0":"null!=0");

Edited by pikax

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
HappyHippyHippo

Exato.

O que eu queria dizer e´que o null representa um endereço de memoria 0, e o \0 representa o valor 0, os valores são iguais mas significam coisas diferentes.

0xffffffff é 4294967295 ou -1 ? qual é a diferença ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
AJBM

Eu vi isto no livro de Luis Damas.

Null e um outro nome para terminador de strings \0.

Falso, NULL- representa o endereço de memoria numero 0.

'\0' -representa o carater cujo o codigo asci e 0.

Eu o que tiro disto é que null e '\0' são coisas diferentes, apesar de o valor em si ser igual.

Share this post


Link to post
Share on other sites
AJBM

tu dizes batata eu digo Solanum tuberosum

LOOL

Pelo que eu li foi o que eu entendi.

Mas fiz uns testes e parece ser a mesma coisa.

Share this post


Link to post
Share on other sites
pikax

para o compilador de C e' a mesma coisa, mas pode causar confusao a outro programador.


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
thoga31

Conclusão importante para o OP: o ciclo while termina porque uma atribuição devolve em si mesma um valor, apesar de este ser geralmente descartado. No entanto, dentro de um ciclo como o while, o ciclo termina quando é feita a atribuição do valor 0 ou \0 (pormenores já debatidos acima).

Portanto, quando atribuímos '\0' a *dest, o ciclo vai receber por sua vez o \0, e termina.

É assim que se sabe quando é que a string chegou ao fim: aproveitando o facto de uma atribuição retornar um valor per se, valor este igual ao último valor atribuído.


Knowledge is free!

Share this post


Link to post
Share on other sites
AJBM

Ja agora aproveito para tirar outra duvida.

char name[4 + 1], *ptr;
gets(name);
ptr = name;
printf("%s %s", name, ptr);

se o name for joao

O resultado do printf e joao joao.

Supostamente não devia ser joao e o endereço de memoria de name?

Se eu puser %d da-me o endereço de memoria %s da-me o valor para que o ptr esta apontar.

Alguém me pode dizer porque?

Share this post


Link to post
Share on other sites
thoga31

Sabes que o printf e o scanf recebem como primeiro argumento a formatação do que deve ser escrito e lido, respectivamente, certo?

Então, se ptr é um apontador, deverá ser indicado no printf %p (de pointer), e não %s, que é para Strings, nem %d, que é para inteiros.


Knowledge is free!

Share this post


Link to post
Share on other sites
thoga31

No primeiro resultado do Google para "printf" tens uma excelente referência para conheceres melhor as funções do C. Neste caso, do printf - a primeira tabela aborda os parâmetros. Dá uma vista de olhos ;)


Knowledge is free!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.