Como adiciono duas strings?
Eu tentei name = "derp" + "herp";
, mas recebi um erro:
A expressão deve ter tipo integral ou enum
C não tem suporte para strings que alguns outros idiomas possuem. Uma string em C é apenas um ponteiro para uma matriz char
terminada pelo primeiro caractere nulo. Não há operador de concatenação de cadeias em C.
Use strcat
para concatenar duas strings. Você pode usar a seguinte função para fazer isso:
#include <stdlib.h>
#include <string.h>
char* concat(const char *s1, const char *s2)
{
char *result = malloc(strlen(s1) + strlen(s2) + 1); // +1 for the null-terminator
// in real code you would check for errors in malloc here
strcpy(result, s1);
strcat(result, s2);
return result;
}
Esta não é a maneira mais rápida de fazer isso, mas você não deve se preocupar com isso agora. Observe que a função retorna um bloco de memória alocada ao heap ao chamador e passa a propriedade dessa memória. É de responsabilidade do chamador free
a memória quando ela não é mais necessária.
Chame a função assim:
char* s = concat("derp", "herp");
// do things with s
free(s); // deallocate the string
Se você se incomodou com o desempenho, evitaria varrer repetidamente os buffers de entrada procurando o terminador nulo.
char* concat(const char *s1, const char *s2)
{
const size_t len1 = strlen(s1);
const size_t len2 = strlen(s2);
char *result = malloc(len1 + len2 + 1); // +1 for the null-terminator
// in real code you would check for errors in malloc here
memcpy(result, s1, len1);
memcpy(result + len1, s2, len2 + 1); // +1 to copy the null-terminator
return result;
}
Se você planeja trabalhar muito com strings, pode ser melhor usar um idioma diferente que tenha suporte de primeira classe para strings.
return memcpy(result, s1, len1);
. Embora uma micro-otimização ou pelo menos um pouco de código de golfe, essas melhorias em potencial nas operações básicas de cadeia podem ter valor devido ao seu alto uso.stpcpy
, que retorna um ponteiro para o final da primeira string:strcpy(stpcpy(result, s1), s2);
fonte
David Heffernan explicou o problema em sua resposta e eu escrevi o código aprimorado. Ver abaixo.
Uma função genérica
Podemos escrever uma função variadic útil para concatenar qualquer número de strings:
Uso
Resultado:
Limpar
Observe que você deve liberar a memória alocada quando ela for desnecessária para evitar vazamentos de memória:
fonte
int len
->size_t len
comosize_t
é o tipo certo para o código "size". Também// room for NULL
->// room for null character
NULL
implica o ponteiro nulo.Presumo que você precise para coisas pontuais. Eu assumo que você é um desenvolvedor de PC.
Use a pilha, Luke. Use-o em qualquer lugar. Não use malloc / livre para pequenas alocações, nunca .
Se 10 KB por string não forem suficientes, adicione zero ao tamanho e não se preocupe - eles liberarão sua memória de pilha no final dos escopos de qualquer maneira.
fonte
snprintf(result, sizeof result, "%s %s %s", s1, s2, s3);
Você deveria usar
strcat
, ou melhorstrncat
,. Pesquise no Google (a palavra-chave é "concatenar").fonte
strncat()
é uma função extremamente difícil de usar corretamente. Rapidamente, sem olhar para o manual, qual o comprimento especificadostrncat()
? Se você disse "o tamanho do buffer", acabou de demonstrar meu ponto de vista. Possui uma interface contra-intuitiva e, quando você tem dados suficientes para usá-los com segurança, não precisa usar a função em primeiro lugar - existem outras alternativas, mais rápidas e mais eficientes (comostrcpy()
oumemmove()
) que podem ser usadas em vez de. Praticamente qualquer que seja a pergunta "o que devo usar",strncat()
não é a resposta.Você não pode adicionar literais de string como esse em C. Você deve criar um buffer de tamanho da string literal um + string literal dois + um byte para caractere de terminação nulo e copiar os literais correspondentes para esse buffer e também garantir que ele seja terminado nulo . Ou você pode usar funções de biblioteca como
strcat
.fonte
Sem extensão GNU:
Como alternativa com a extensão GNU:
Veja malloc , free e asprintf para mais detalhes.
fonte
fonte
Concatenar strings
A concatenação de duas seqüências de caracteres em C pode ser feita de pelo menos três maneiras: -
1) Copiando a sequência 2 para o final da sequência 1
2) Copiando a sequência 1 e a sequência 2 para a sequência 3
3) Usando a função strcat ()
fonte
Em C, você realmente não possui seqüências de caracteres, como um objeto genérico de primeira classe. É necessário gerenciá-los como matrizes de caracteres, o que significa que é necessário determinar como você deseja gerenciar suas matrizes. Uma maneira é obter variáveis normais, por exemplo, colocadas na pilha. Outra maneira é alocá-los dinamicamente usando
malloc
.Depois de ordenar isso, você pode copiar o conteúdo de uma matriz para outra, para concatenar duas cadeias usando
strcpy
oustrcat
.Dito isto, C tem o conceito de "literais de strings", que são strings conhecidas em tempo de compilação. Quando usados, eles serão uma matriz de caracteres colocada na memória somente leitura. No entanto, é possível concatenar dois literais de cadeia de caracteres, escrevendo-os um ao lado do outro, como em
"foo" "bar"
, o que criará a cadeia de caracteres literal "foobar".fonte
usando memcpy
fonte