Jump to content

[Resolvido] Apontadores e Strings


AJBM

Recommended Posts

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?

Link to comment
Share on other sites

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."

Link to comment
Share on other sites

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."

Link to comment
Share on other sites

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."

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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."

Link to comment
Share on other sites

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."

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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?

Link to comment
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.