Tentando entender a função strcat [RESOLVIDO]

1. Tentando entender a função strcat [RESOLVIDO]

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 30/11/2021 - 22:53h

Boa Noite a todos.

Baseado em uma pergunta anterior que fiz, e tentando buscar uma forma de aprender a encontrar as funções existentes em C, surgiu essa dúvida!

No Site: https://elixir.bootlin.com/glibc/latest/A/ident/strcat
Tive dificuldades de saber afinal onde estava de fato a strcat

Penso ter achado ela aqui: https://elixir.bootlin.com/glibc/latest/source/string/strcat.c#L20
#undef strcat

#ifndef STRCAT
# define STRCAT strcat
#endif

/* Append SRC on the end of DEST. */
char *
STRCAT (char *dest, const char *src)
{
strcpy (dest + strlen (dest), src);
return dest;
}
libc_hidden_builtin_def (strcat)

Imaginando que o código acima seja de verdade a strcat, Me surpreendeu bastante a strcat ser na verdade uma strcpy!
Então tentando fazer o código acima funcionar, e claro com alguma dificuldade montei o exemplo abaixo!
#include <stdio.h>
#include <string.h> // strlen

char *MyStrcat(char *dest, const char *src) {
strcpy (dest + strlen(dest), src);
return dest;
}

int main() {
char Text[80] = {0};
MyStrcat(Text,"Viva");
MyStrcat(Text," o ");
MyStrcat(Text,"Linux");
puts(Text);
}

Repare que precisei colocar: char * Mas não sei se minha escolha é a correta!
Escolhi char com um ponteiro, por tratar-se de um vetor char de caracteres.

Minha dúvida de fato é: A função que eu montei é a strcat verdadeira? A que usamos normalmente em C?


  


2. MELHOR RESPOSTA

Heitor Costa
Heitor.rj

(usa Slackware)

Enviado em 06/12/2021 - 21:35h

ApprenticeX escreveu:

Boa Noite a todos.

Baseado em uma pergunta anterior que fiz, e tentando buscar uma forma de aprender a encontrar as funções existentes em C, surgiu essa dúvida!

No Site: https://elixir.bootlin.com/glibc/latest/A/ident/strcat
Tive dificuldades de saber afinal onde estava de fato a strcat

Penso ter achado ela aqui: https://elixir.bootlin.com/glibc/latest/source/string/strcat.c#L20
#undef strcat

#ifndef STRCAT
# define STRCAT strcat
#endif

/* Append SRC on the end of DEST. */
char *
STRCAT (char *dest, const char *src)
{
strcpy (dest + strlen (dest), src);
return dest;
}
libc_hidden_builtin_def (strcat)

Imaginando que o código acima seja de verdade a strcat, Me surpreendeu bastante a strcat ser na verdade uma strcpy!
Então tentando fazer o código acima funcionar, e claro com alguma dificuldade montei o exemplo abaixo!
#include <stdio.h>
#include <string.h> // strlen

char *MyStrcat(char *dest, const char *src) {
strcpy (dest + strlen(dest), src);
return dest;
}

int main() {
char Text[80] = {0};
MyStrcat(Text,"Viva");
MyStrcat(Text," o ");
MyStrcat(Text,"Linux");
puts(Text);
}

Repare que precisei colocar: char * Mas não sei se minha escolha é a correta!
Escolhi char com um ponteiro, por tratar-se de um vetor char de caracteres.

Minha dúvida de fato é: A função que eu montei é a strcat verdadeira? A que usamos normalmente em C?


A função que você encontrou no site mencionado ela é a mesma encontrada na glibc, logo pode-se dizer sim que é a mesma strcat que você usa no seu linux quando compila usando o comando gcc.

Você pode também se assim desejar, baixar os sources completos no site: ftp.gnu.org/gnu/glibc
Procure por glibc-2.34.tar.xz

Dentro desse arquivo basta fazer uma busca por *.c e você localiza todos os sources, a strcat.c a mesma que você viu no site vai estar dentro da pasta string.
Você mencionou que deseja estudar os sources, com o arquivo que informo acima você conseguirá estudar todos eles.
Lembrando que são os sources da glibc que é a libc do projeto GNU, porém é o mesmo que você usa no seu computador!
A GNU C Library, ou glibc, é a biblioteca padrão do C do projeto GNU.

3. Re: Tentando entender a função strcat [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 01/12/2021 - 07:33h

Não entendi sua dúvida, dado que você copiou a implementação que viu no site.

Pode explicar melhor o que você não entendeu?


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


4. Re: Tentando entender a função strcat

berghetti
berghetti

(usa Debian)

Enviado em 01/12/2021 - 12:12h

Minha dúvida de fato é: A função que eu montei é a strcat verdadeira? A que usamos normalmente em C?


não tem essa de função verdadeira,
a função faz oque a se propõe a fazer e essa é uma implementação, pode ter varias implementações.

essa implementação é verdadeira para a glibc, mas para a biblioteca do windows pode não ser.



5. Re: Tentando entender a função strcat [RESOLVIDO]

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 01/12/2021 - 15:24h

paulo1205 escreveu:
Não entendi sua dúvida, dado que você copiou a implementação que viu no site.
Pode explicar melhor o que você não entendeu?
... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)

Minha dúvida é se essa strcat que eu copiei é a strcat verdadeira que usamos ao usar o comando strcat.
Tipo: Por eu ter encontrado ela na Internet, eu não sei ao certo se ela é escrita assim, pois no meu PC não encontro um arquivo strcat.c tipo o código fonte do strcat do gcc que uso no meu PC.

Meu objetivo é conhecer as funções verdadeiras que atualmente eu uso no C, usando o gcc. Eu entendi que o gcc usa a glibc onde estariam o source de todas as funções como strcat, strcpy, printf, scanf e etc... Então eu vendo o source, ou seja o que elas fazem de verdade, saberei mais. Isso porque não encontrei em lugar algum a libc que entendi ser as bibliotecas do C, que em minha opinião seria melhor pra estudar.

Então eu mostrei a implementação que vi no site! Mas não sei se o source dela é verdadeiro, o existente no gcc, ou se ela foi feita por alguém e nada tem a ver com a strcat que uso. Quando procuro no pc por exemplo na string.h não existe uma função strcat neste arquivo, apenas um cabeçalho

Meu objetivo é ver de fato as funções o que está escrito nelas e saber como foram feitas! Esse site me pareceu mostrar o source delas, mas é o source delas? Ou são funções criadas que nada tem a ver com a original?

Eu até baixei o source do gcc v.2.34 (glibc-2.34.tar.xz) procurando o source de suas funções, mas ele possue 5 strcat.c
Então se eu entender como identificar dos 5 o correto, conseguirei o mesmo para as outras funções. E esse do exemplo me pareceu ser o source mais óbvio, só gostaria de ter certeza, para não seguir por um caminho errôneo


6. Re: Tentando entender a função strcat [RESOLVIDO]

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 01/12/2021 - 15:36h

berghetti escreveu:

Minha dúvida de fato é: A função que eu montei é a strcat verdadeira? A que usamos normalmente em C?


não tem essa de função verdadeira,
a função faz oque a se propõe a fazer e essa é uma implementação, pode ter varias implementações.

essa implementação é verdadeira para a glibc, mas para a biblioteca do windows pode não ser.

Vamos ver se eu entendi.
O que entendi até aqui é que C seria apenas a libc que infelizmente não sei onde baixar! Pois eu queria estudar o Original sem modificações de terceiros.
Então neste caso recorri a glibc que o gcc usa, o que nunca foi meu objetivo, estudar um source futucado, mas fiquei sem opção.

Então além desses 2 sources de C, existe um separado só pra windows?
Pois até então eu apenas conhecia a existência de bibliotecas extras que nem fazem parte da Standard do C.
Achava que no caso do gcc que serve tanto para Linux qto para Windows fosse a mesma biblioteca e não separadas.

Eu nem me preocupei em baixar source do MinGW achando que fosse desnecessário estudar suas funções, acreditando serem as mesmas. Até porque imaginei que um source básico de C feito no Linux seria compilado normalmente no MinGW no Windows. Não testei nada disso ainda!


7. Re: Tentando entender a função strcat [RESOLVIDO]

berghetti
berghetti

(usa Debian)

Enviado em 01/12/2021 - 15:50h

O que entendi até aqui é que C seria apenas a libc que infelizmente não sei onde baixar

Não, libc é uma especificação, assim como a linguagem C em si, e a partir dessa especificação tem varias implementações.

Então além desses 2 sources de C, existe um separado só pra windows?


quais dois sources?
existem varias implementações da standard lib C,
Ex:
* BSD libc;
* GNU libc (gblic);
* Microsoft C run-time library;
* Musl;
* Bionic;


fonte: https://en.wikipedia.org/wiki/C_standard_library









Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts