#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
// se eu colocar que o vetor terá 20 caracteres, se eu digitar 21 dará um buffer overflow
char *lastName = NULL;
char *firstName = NULL;
char *fullName = NULL;
int pos;
size_t tam1, tam2, tamanho;
// passando o scanf usando %ms, ele vai alocar na hora o tamanho necessário para guardar a string
scanf("%ms", &firstName
);
printf("\nEntrada:\n%s - %lu chars\n%s - %lu chars\n%d\n", firstName
, strlen(firstName
), lastName
, strlen(lastName
), pos
);
// a função vai alocar o espaço para a nova string, sem mexer nas outras
// +1 pro caractere \0 do final
tamanho = tam1 + tam2 + 1;
printf("Tamanho total fullName: %lu chars\n", tamanho
); // checa se pos é válido
if (pos < 1 || pos > tam1) {
printf("Pos é inválido, não podemos continuar"); } else {
// copia o início da 1
memcpy(fullName
, firstName
, pos
); // copia os caracteres da 2 menos o 0
memcpy(fullName
+ pos
, lastName
, tam2
); // cpoia o resto da 1
memcpy(fullName
+ pos
+ tam2
, &firstName
[pos
], tam1
- pos
); // será que precisa?
fullName[tamanho - 1] = 0;
printf("\nConcatenando:\n%s\n", fullName
); }
// depois de alocar dinamicamente, liberar a memória depois de usar
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgppbnQgbWFpbih2b2lkKSB7CiAvLyBzZSBldSBjb2xvY2FyIHF1ZSBvIHZldG9yIHRlcsOhIDIwIGNhcmFjdGVyZXMsIHNlIGV1IGRpZ2l0YXIgMjEgZGFyw6EgdW0gYnVmZmVyIG92ZXJmbG93CiBjaGFyICpsYXN0TmFtZSA9IE5VTEw7CiBjaGFyICpmaXJzdE5hbWUgPSBOVUxMOwogY2hhciAqZnVsbE5hbWUgPSBOVUxMOwogaW50IHBvczsKIHNpemVfdCB0YW0xLCB0YW0yLCB0YW1hbmhvOwogCiBwcmludGYoIk9pIG11bmRvIVxuIik7CiAKIC8vIHBhc3NhbmRvIG8gc2NhbmYgdXNhbmRvICVtcywgZWxlIHZhaSBhbG9jYXIgbmEgaG9yYSBvIHRhbWFuaG8gbmVjZXNzw6FyaW8gcGFyYSBndWFyZGFyIGEgc3RyaW5nCiBzY2FuZigiJW1zIiwgJmZpcnN0TmFtZSk7CiBzY2FuZigiJW1zIiwgJmxhc3ROYW1lKTsKIHNjYW5mKCIlZCIsICZwb3MpOwogCiBwcmludGYoIlxuRW50cmFkYTpcbiVzIC0gJWx1IGNoYXJzXG4lcyAtICVsdSBjaGFyc1xuJWRcbiIsIGZpcnN0TmFtZSwgc3RybGVuKGZpcnN0TmFtZSksIGxhc3ROYW1lLCBzdHJsZW4obGFzdE5hbWUpLCBwb3MpOwogCiAvLyBhIGZ1bsOnw6NvIHZhaSBhbG9jYXIgbyBlc3Bhw6dvIHBhcmEgYSBub3ZhIHN0cmluZywgc2VtIG1leGVyIG5hcyBvdXRyYXMKIHRhbTEgPSBzdHJsZW4oZmlyc3ROYW1lKTsKIHRhbTIgPSBzdHJsZW4obGFzdE5hbWUpOwogLy8gKzEgcHJvIGNhcmFjdGVyZSBcMCBkbyBmaW5hbAogdGFtYW5obyA9IHRhbTEgKyB0YW0yICsgMTsKIHByaW50ZigiVGFtYW5obyB0b3RhbCBmdWxsTmFtZTogJWx1IGNoYXJzXG4iLCB0YW1hbmhvKTsKIGZ1bGxOYW1lID0gbWFsbG9jKHRhbWFuaG8pOwogLy8gY2hlY2Egc2UgcG9zIMOpIHbDoWxpZG8KIGlmIChwb3MgPCAxIHx8IHBvcyA+IHRhbTEpIHsKIAlwcmludGYoIlBvcyDDqSBpbnbDoWxpZG8sIG7Do28gcG9kZW1vcyBjb250aW51YXIiKTsKIH0gZWxzZSB7CiAgLy8gY29waWEgbyBpbsOtY2lvIGRhIDEKICBtZW1jcHkoZnVsbE5hbWUsIGZpcnN0TmFtZSwgcG9zKTsKICAvLyBjb3BpYSBvcyBjYXJhY3RlcmVzIGRhIDIgbWVub3MgbyAwCiAgbWVtY3B5KGZ1bGxOYW1lICsgcG9zLCBsYXN0TmFtZSwgdGFtMik7CiAgLy8gY3BvaWEgbyByZXN0byBkYSAxCiAgbWVtY3B5KGZ1bGxOYW1lICsgcG9zICsgdGFtMiwgJmZpcnN0TmFtZVtwb3NdLCB0YW0xIC0gcG9zKTsKICAvLyBzZXLDoSBxdWUgcHJlY2lzYT8KICBmdWxsTmFtZVt0YW1hbmhvIC0gMV0gPSAwOwogIHByaW50ZigiXG5Db25jYXRlbmFuZG86XG4lc1xuIiwgZnVsbE5hbWUpOwogfQogCiAvLyBkZXBvaXMgZGUgYWxvY2FyIGRpbmFtaWNhbWVudGUsIGxpYmVyYXIgYSBtZW3Ds3JpYSBkZXBvaXMgZGUgdXNhcgogZnJlZShmaXJzdE5hbWUpOwogZnJlZShsYXN0TmFtZSk7CiBmcmVlKGZ1bGxOYW1lKTsKIAogcmV0dXJuIDA7Cn0K