Jump to content

[Resolvido] Apontadores e Strings


Recommended Posts

Posted

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?

Posted (edited)

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

Posted

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.

Posted (edited)

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

Posted

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

Posted

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.

Posted (edited)

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
Posted (edited)

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

Posted

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.

Posted

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

Posted

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!

Posted

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?

Posted

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!

Posted

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!

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.