Ir ao conteúdo
  • Cadastre-se

C concatenar strings e inteiro


Ir à solução Resolvido por devair1010,

Posts recomendados

Postado

Criar uma função que recebe duas strings e um inteiro n como parâmetro e retorna uma nova string formada pela concatenação da primeira string com os
primeiros n caracteres da segunda string.

 

#include <stdio.h>
#include <assert.h>
#include<stdlib.h>
#include<string.h>

//
// Função  duas string
//

void contatenarStrings (char  string1[], char string2[], int pos);

int main(void){
 char lastName[20];
 char firstName[20];
 
 int pos;
 
 
 scanf("%s", firstName);
 scanf("%s", lastName);
 scanf("%d", &pos);
  contatenarStrings(firstName, lastName, pos);
 printf("%s\n", firstName);
 return 0;
}

void contatenarStrings (char  string1[], char string2[], int pos)
{    
    char tmp[20];
    strncpy(tmp, string1, pos);
    strcat(tmp, string2);
    strcat(tmp, &string1[pos]);
    strcpy(string1, tmp);
}

Fonte: https://www.clubedohardware.com.br/forums/topic/1383163-montar-duas-string-que-chame-a-outra-o-ru-sera-8/

 

Como ficaria essa função(contatenarStrings) sem usar funções prontas da bibliotega string

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NOME 1
#define CHAR 50

void concatena  (char a[], char b[])
{
 printf("%s %s\n\n", a, b);  
}


int main()
{
     
     
    char nome[NOME][CHAR], sobrenome [NOM][CHAR];
    int i, encontrou = 0;

    for (i = 1; i <= NOME; i++)
    {
        printf("\nDigite o nome %d: \n", i);
        scanf(" %[^\n]s",nome[i]);
    }
   
       for (i = 1; i <= NOME; i++)
    {
        printf("\nDigite o sobrenome %d: \n", i);
        scanf(" %[^\n]s",sobrenome[i]);
    }
   
       printf("\n\n\n");
      
     for (i = 1; i <= NOME; i++)
    {
        concatena(nome [i], sobrenome [i]);
    }

    printf("\n\n\n");
  
 
 }
                         
  

Desse jeito eu consigo concatenar, mais não entendi bem a lógica do N inteiro.

  • Obrigado 1
Postado

Para não erra na função do enunciado use somente a linguagem (vetores; ‘loops’ e estruturas de decisão), ou seja, na composição dessa função não se chama funções da biblioteca padrão e de nenhuma outra.

 

1 hora atrás, Jose_Luiz disse:

Criar uma função que recebe duas strings e um inteiro n como parâmetro e retorna uma nova string formada pela concatenação da primeira string com os
primeiros n caracteres da segunda string.

RETORNA uma nova “string”, compreende-se que as ‘strings’ dos parâmetros são parcelas e não podem ser alteradas.

 

char * string_concat (const char  string1[], const char string2[], unsigned n);

 

 

Dos comandos necessários me pareceu conhecer todos, exceto IF-ELSE

  • Obrigado 2
Postado

@Jose_Luiz    mas ali você não concatenou , apenas imprimiu todos os caracteres das duas strings , e para concatenar você pode criar uma terceira string com o tamanho somado das duas primeira , e ir adicionando os caracteres das duas e no final coloque o finalizador de string's que é esse "\0" , sem as aspas , e retorna essa string para a main e lá  escreve essa terceira string .

  • Obrigado 1
  • Solução
Postado

@Jose_Luiz     sem usar a biblioteca string e nenhuma função dessa biblioteca , seu código poderia ser assim  :

#include <stdio.h>
#define NOME 1
#define CHAR 50
char    *concatena(char *a,char *b);
int main(){
    char nome[NOME][CHAR], sobrenome[NOME][CHAR];
    int i;
    char *res;
    for( i=0; i<NOME; i++ )
    {
        printf("\nDigite o nome %d: \n", i);
        scanf(" %[^\n]s",nome[i]);
    }
    for( i=0; i<NOME; i++ )
    {
        printf("\nDigite o sobrenome %d: \n", i);
        scanf(" %[^\n]s",sobrenome[i]);
    }
    res = concatena(nome[0],sobrenome[0] );
    printf("A Variavel Retornada => %s\n\n",res/*Variavel*/);
    return 32768;
}
char       *concatena(char *a,char *b)
{
    int ta=0,tb=0,w;
    for(w=0;a[w]!='\0';w++)ta++;
    for(w=0;b[w]!='\0';w++)tb++;
    char *c;
    c = malloc(ta+tb+1);
    for(w=0;w<ta;w++)c[w] = a[w];
    for(;w<(ta+tb);w++)c[w] = b[w-ta];
    c[w] = '\0';
    return c;
}

 

  • Confuso 1
Postado
4 minutos atrás, devair1010 disse:

@Jose_Luiz     sem usar a biblioteca string e nenhuma função dessa biblioteca , seu código poderia ser assim  :



#include <stdio.h>
#define NOME 1
#define CHAR 50
char    *concatena(char *a,char *b);
int main(){
    char nome[NOME][CHAR], sobrenome[NOME][CHAR];
    int i;
    char *res;
    for( i=0; i<NOME; i++ )
    {
        printf("\nDigite o nome %d: \n", i);
        scanf(" %[^\n]s",nome[i]);
    }
    for( i=0; i<NOME; i++ )
    {
        printf("\nDigite o sobrenome %d: \n", i);
        scanf(" %[^\n]s",sobrenome[i]);
    }
    res = concatena(nome[0],sobrenome[0] );
    printf("A Variavel Retornada => %s\n\n",res/*Variavel*/);
    return 32768;
}
char       *concatena(char *a,char *b)
{
    int ta=0,tb=0,w;
    for(w=0;a[w]!='\0';w++)ta++;
    for(w=0;b[w]!='\0';w++)tb++;
    char *c;
    c = malloc(ta+tb+1);
    for(w=0;w<ta;w++)c[w] = a[w];
    for(;w<(ta+tb);w++)c[w] = b[w-ta];
    c[w] = '\0';
    return c;
}

 

você incluiu ponteiros e alocação de memória. Obrigado!! Para fins de estudos e aprofundamento está excelente!! 

  • Obrigado 1
Postado
19 horas atrás, devair1010 disse:

@Jose_Luiz     sem usar a biblioteca string e nenhuma função dessa biblioteca , seu código poderia ser assim  :


#include <stdio.h>
#define NOME 1
#define CHAR 50
char    *concatena(char *a,char *b);
int main(){
    char nome[NOME][CHAR], sobrenome[NOME][CHAR];
    int i;
    char *res;
    for( i=0; i<NOME; i++ )
    {
        printf("\nDigite o nome %d: \n", i);
        scanf(" %[^\n]s",nome[i]);
    }
    for( i=0; i<NOME; i++ )
    {
        printf("\nDigite o sobrenome %d: \n", i);
        scanf(" %[^\n]s",sobrenome[i]);
    }
    res = concatena(nome[0],sobrenome[0] );
    printf("A Variavel Retornada => %s\n\n",res/*Variavel*/);
    return 32768;
}
char       *concatena(char *a,char *b)
{
    int ta=0,tb=0,w;
    for(w=0;a[w]!='\0';w++)ta++;
    for(w=0;b[w]!='\0';w++)tb++;
    char *c;
    c = malloc(ta+tb+1);
    for(w=0;w<ta;w++)c[w] = a[w];
    for(;w<(ta+tb);w++)c[w] = b[w-ta];
    c[w] = '\0';
    return c;
}

 

Nesse caso ainda faltou informa a posição em que essa string será concatenada!

19 horas atrás, Jose_Luiz disse:

você incluiu ponteiros e alocação de memória. Obrigado!! Para fins de estudos e aprofundamento está excelente!! 

Nesse caso ainda faltou informa a posição em que essa string será concatenada!

  • Obrigado 1
Postado
3 minutos atrás, devair1010 disse:

@Jose_Luiz     qual posição ?

Na vdd não é bem a posição, é quantidade de caracteres que vai ser concatenada da segunda palavra.

Exemplo:

1ª palavra: Viver   

2ª palavra: Feliz 

quantidade caracteres da 2ª palavra a serem concatenada: 2 

Nova palavra: ViverFe

ou seja imprimir a concatenação da segunda palavra somente a quantidade caracteres  informada.

  • Amei 1
Postado

@Jose_Luiz    para essa parte precisa enviar outro dado por parâmetro para a função , informando a quantidade ,  e para isso você precisa criar uma variável do tipo int e usar no scanf , para pegar esse dado e inclua no protótipo da função essa outra variável que irá receber a quantidade e na função no último loop for modifique a condição de parada do loop for , que poderá ser assim  :

for(w=0;b[w]!='\0';w++)tb++;
if (q>tb)q=tb;
for(     ; w<ta+q ; w++ )c[w] = b[w-ta];

faça as modificações e poste seu código completo , para ajudarmos se precisar de alguma correção   .

  • Curtir 1
Postado
Em 11/10/2020 às 17:13, mauro_b disse:

RETORNA uma nova “string”, compreende-se que as ‘strings’ dos parâmetros são parcelas e não podem ser alteradas.

Pensei outra forma nada genial, mas suponha que já tem uma função que copia n caracteres.

char *
cstring_copie_n (char destino [], char const origem, int unsigned n);

 

Para implementar a do exercício, basicamente, chamaria a que copia (reutilizando código) 2x.

char *  cstring__concatene (char const string1 [], char const string2 [], n) {
  
	/*... pega os tamanhos */
	size_t  string1_tamanho= cstring__comprimento (string1);
	size_t  string2_tamanho= cstring__comprimento (string2);
  
	/*... Aloca memoria [static, heap] para variavel string_r  */
  	char  *string_r= /* MEMORIA ALLOC: string1_tamanho + n + 1 */;
  
	/*... Lembre-se unsigned (-1) é o máx uint. */
	(void) cstring__copie_n (string_r                  , string1, -1); 
	(void) cstring__copie_n (string_r + string1_tamanho, string2,  n);
  
	return string_r
}
  • Curtir 1
  • Obrigado 1
Postado

Já que está resolvido, outra forma de fazer poderia ser assim,

 

Na função usei três loops: No primeiro incremento o ponteiro para o endereço do fim da primeira string e aloco memória calculando a diferença desse endereço para o da primeira string + n; Já nos outros dois loops faço a atribuição dos caracteres para a nova string que será retornada pela função.

 

#include <stdio.h>
#include <stdlib.h>

char *concatenar(char *p1, char *p2, int n){
    char *p, *nova = p1;
    
    while(*nova++){}
    nova = p = (char *)malloc((nova - p1) + n);
    while(*p1){*p++ = *p1++;}
    while(n--){*p++ = *p2++;}
    *p = 0;

    return nova;
}

int main(){
    char p1[50], p2[50];
    int n;

    scanf("%s %s %d",p1,p2,&n);
    printf("%s\n",concatenar(p1,p2,n));
    
    return 0;
}

 

  • Obrigado 1
  • Amei 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...