AJBM Posted September 11, 2013 at 09:55 AM Report #524076 Posted September 11, 2013 at 09:55 AM 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?
pikax Posted September 11, 2013 at 09:59 AM Report #524077 Posted September 11, 2013 at 09:59 AM (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 September 11, 2013 at 10:03 AM 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."
nelsonr Posted September 11, 2013 at 09:59 AM Report #524078 Posted September 11, 2013 at 09:59 AM Até encontrar o caracter \0
AJBM Posted September 11, 2013 at 10:25 AM Author Report #524081 Posted September 11, 2013 at 10:25 AM 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.
pikax Posted September 11, 2013 at 10:29 AM Report #524085 Posted September 11, 2013 at 10:29 AM (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 September 11, 2013 at 10:32 AM 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."
nelsonr Posted September 11, 2013 at 10:31 AM Report #524087 Posted September 11, 2013 at 10:31 AM acho que o AJBM não se referiu ao '0' - ascii 48, mas sim ao ASCII 0
pikax Posted September 11, 2013 at 10:34 AM Report #524089 Posted September 11, 2013 at 10:34 AM 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."
AJBM Posted September 11, 2013 at 10:40 AM Author Report #524091 Posted September 11, 2013 at 10:40 AM 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.
nelsonr Posted September 11, 2013 at 10:43 AM Report #524092 Posted September 11, 2013 at 10:43 AM (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 September 11, 2013 at 10:43 AM by nelsonr
pikax Posted September 11, 2013 at 10:44 AM Report #524093 Posted September 11, 2013 at 10:44 AM (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 September 11, 2013 at 10:44 AM 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."
HappyHippyHippo Posted September 11, 2013 at 11:16 AM Report #524102 Posted September 11, 2013 at 11:16 AM 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 Portugol Plus
AJBM Posted September 11, 2013 at 02:14 PM Author Report #524140 Posted September 11, 2013 at 02:14 PM 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.
HappyHippyHippo Posted September 11, 2013 at 02:25 PM Report #524145 Posted September 11, 2013 at 02:25 PM tu dizes batata eu digo Solanum tuberosum IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
AJBM Posted September 11, 2013 at 02:34 PM Author Report #524147 Posted September 11, 2013 at 02:34 PM 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.
pikax Posted September 11, 2013 at 02:40 PM Report #524152 Posted September 11, 2013 at 02:40 PM 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."
thoga31 Posted September 11, 2013 at 03:00 PM Report #524157 Posted September 11, 2013 at 03:00 PM 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!
AJBM Posted September 12, 2013 at 09:46 AM Author Report #524230 Posted September 12, 2013 at 09:46 AM 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?
thoga31 Posted September 12, 2013 at 11:22 AM Report #524243 Posted September 12, 2013 at 11:22 AM 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!
AJBM Posted September 12, 2013 at 01:25 PM Author Report #524282 Posted September 12, 2013 at 01:25 PM Sabia. Não sabia que havia para apontadores.
thoga31 Posted September 12, 2013 at 03:10 PM Report #524319 Posted September 12, 2013 at 03:10 PM 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!
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now