Gerando String Dinamica em C
Publicado por Pedro Robson Leão 04/06/2007
[ Hits: 12.733 ]
Após me deparar com pessoal em várias listas perguntando sobre como construir uma string dinâmica em "C", acabei por construir uma função de uso fácil que encapsula os comando malloc e realloc usados para criar a alocação dinâmica.
Cuidado! Por usar alocação dinâmica, o comando free deve sempre ser utilizado após o uso da variável.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
 * int strnadd(char **out, size_t size_out, char *in, size_t size_in)
 *
 * Esta funcao utiliza alocacao dinamica nao esqueca de utilizar o comando free para liberar a area ao SO
 *
 * @author pedro.leao@gmail.comando
 * @since 2007/May
 *
 * @param (char **) out = endereco do ponteiro de saida
 * @param size_t size_out = quantidade de bytes existentes no ponteiro de saida
 * @param char *in = ponteiro com string de entrada
 * @param size_t = tamanho da string de entrada
 * @return int = Erro < 0 ou quantidade de bytes total na variavel
 */
int strnadd(char **out, size_t size_out, char *in, size_t size_in) {
   char *p;
   if(!*out) {
      size_out = 0;
      *out = malloc(size_in+1);
      if(!*out) {
         return -1;
      }
   } else {
      p = realloc(*out, size_out + size_in + 1);
      if(!p) {
         return -1;
      }
      *out = p;
   }
   memcpy( (*out + size_out), in, size_in );
   *( *out + size_out + size_in )=0;
   return size_out + size_in;
}
/**
 * int stradd(char **out, size_t size_out, char *in)
 *
 * Esta funcao utiliza alocacao dinamica nao esqueca de utilizar o comando free para liberar a area ao SO
 *
 * @author pedro.leao@gmail.comando
 * @since 2007/May
 *
 * @param (char **) out = endereco do ponteiro de saida
 * @param size_t size_out = quantidade de bytes existentes no ponteiro de saida
 * @param char *in = ponteiro com string de entrada, a string deve ser terminada com zero binario, "{FONTE}'
 * @return int = Erro < 0 ou quantidade de bytes total na variavel
 */
int stradd(char **out, size_t size_out, char *in) {
   return strnadd(out, size_out, in, strlen(in));
}
/**
 * main
 * Exemplo de uso das funcoes
 */
int main(int argc, char **argv) {
   char *string=NULL;
   size_t str_size=0;
   int i;
   for(i=0;i<argc;i++) {
      str_size = stradd(&string, str_size, argv[i]);
      str_size = stradd(&string, str_size, " ");
   }
   if(string) {
      printf("\"%s\"\n", string);
      free(string);
   }
   return EXIT_FAILURE;
}
Script MakePach para correção de platarforma 32 bits para 64
Tipos de Dados Abstrato - TDA - Números Complexos
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Secure boot, artigo interessante, nada técnico. (4)
E aí? O Warsaw já está funcionando no Debian 13? [RESOLVIDO] (14)
copiar library para diretorio /usr/share/..... su com Falha na a... (1)









