Ir ao conteúdo
  • Cadastre-se
JVGS1111

C problema em concatenar strings em C

Posts recomendados

estou tentando concatenar 2 strings em C, deveria funcionar da seguinte maneira:

o usuário digita seu primeiro nome, depois o seu segundo nome e escolhe uma posição no vetor.

a saída deveria ser o primeiro nome do usuário ate a posição do vetor selecionada em seguida o seu segundo nome concatenado e depois o restante do seu primeiro nome.

 

EX:JOAO

guerber

POSIÇAO : 2

saida: JOguerberAO

 

porém meu código percorre o vetor mas não concatena o restante da string no caso o "AO" nao aparece.

alguém consegue identificar o erro?

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

int main(){
	
	char str1[100], str2[100], str3[100];
	int RU, i, x;
	
	printf("Digite seu primeiro nome: "); //salva o primeiro nome
	scanf("%s", &str1);
	printf("Digite seu segundo nome: "); // salva o segundo nome
	scanf("%s", &str2);
	printf("Digite uma posicao: ");//salva a posicao para concatenar
	scanf("%d", &RU);
	// salva a parte concatenada de str1 em str3
	x= 0;
	for(i= 0; i < RU ; i++){
		str3[i] = str1[i]; 
		x = i;
	}
	// concatena str2 com str3
	x += 1;
	i = 0;
	while (str2[i] != '\0' )  {
		str3[x] = str2[i];  
		x++;
		i++;
		
	}
	 // deveria concatenar o restante de str1 par str3
	x += 1;	
	for(i = RU+1; str1[i]!= '\0' ; i++){
		str3[x] = str1[i];                
		x++;
	}
	
	printf("%s\n", str3); // resultado 
	printf("%d\n", x); // mostra o indice x
	printf("%d\n", i);// mostra o indice i
	
	system ("pause");
	return 0;
	
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
#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);
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

No último for i deve começar igual a RU não RU+1.

 

E não vai & antes de str1 e str2 nos dos primeiros scanfs.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Flávio Pedroza estou tentando nao usar funçao, é para um trabalho 

adicionado 2 minutos depois

@isrnick fiz a mudança mas mesmo assim a saída falta duas letras

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>
#include <stdlib.h>

int main(){
	
	char str1[100], str2[100], str3[100];
	int RU, i, x;
	
	printf("Digite seu primeiro nome: "); //salva o primeiro nome
	scanf("%s", &str1);
	printf("Digite seu segundo nome: "); // salva o segundo nome
	scanf("%s", &str2);
	printf("Digite uma posicao: ");//salva a posicao para concatenar
	scanf("%d", &RU);
	// salva a parte concatenada de str1 em str3
	for(i= 0; i < RU ; i++){
		str3[i] = str1[i]; 
	}
    x = i;
	// concatena str2 com str3
	i = 0;
	while (str2[i] != '\0' )  {
		str3[x] = str2[i];  
		x++;
		i++;
	}
	 // deveria concatenar o restante de str1 par str3
	for(i = RU+1; str1[i]!= '\0' ; i++){
		str3[x] = str1[i];                
		x++;
	}
	str3[x] = '\0';
	printf("%s\n", str3); // resultado 
	printf("%d\n", x); // mostra o indice x
	printf("%d\n", i);// mostra o indice i
	
	system ("pause");
	return 0;
	
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Além do i = RU, o x += 1 entre o while e o segundo for também não deveria estar aí, pois ao contrário do primeiro for está usando x++ dentro do while ao invés de x = i, então já foi incrementado +1 e não precisa desse x += 1.

 

Fora isso também é preciso colocar o '\0' no fim da str3.

 

E também removendo os & dos 2 primeiros scanfs o código fica assim:

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

int main() {

    char str1[100], str2[100], str3[100];
    int RU, i, x;

    printf("Digite seu primeiro nome: "); //salva o primeiro nome
    scanf("%s", str1); //Não vai &
    printf("Digite seu segundo nome: "); // salva o segundo nome
    scanf("%s", str2); //Não vai &
    printf("Digite uma posicao: "); //salva a posicao para concatenar
    scanf("%d", &RU);
    // salva a parte concatenada de str1 em str3
    x = 0;
    for (i = 0; i < RU; i++) {
        str3[i] = str1[i];
        x = i;
    }
    // concatena str2 com str3
    x += 1;
    i = 0;
    while (str2[i] != '\0') {
        str3[x] = str2[i];
        x++;
        i++;

    }
    // deveria concatenar o restante de str1 par str3
    //x += 1;	
    for (i = RU; str1[i] != '\0'; i++) {  //i = RU
        str3[x] = str1[i];
        x++;
    }

    str3[x] = '\0'; //Coloca o caractere nulo no fim

    printf("%s\n", str3); // resultado 
    printf("%d\n", x); // mostra o indice x
    printf("%d\n", i); // mostra o indice i

    system("pause");
    return 0;

}

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Flávio Pedroza @isrnick MUITO obrigado aos 2, me ajudaram muito, principalmente na parte de adicionar \0 no final da string, eu pensava que era automático.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@JVGS1111 Olá, tudo bem!

 

56 minutos atrás, JVGS1111 disse:

@Flávio Pedroza @isrnick MUITO obrigado aos 2, me ajudaram muito, principalmente na parte de adicionar \0 no final da string, eu pensava que era automático.

👌 Que bom que você alcançou a solução de seu problema, agora post no fórum para que futuramente outros (membros) vejam o resultado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma outra opção, usando funções do C para copiar os caracteres:https://ideone.com/z8MioU
 

#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;
 
 printf("Oi mundo!\n");
 
 // passando o scanf usando %ms, ele vai alocar na hora o tamanho necessário para guardar a string
 scanf("%ms", &firstName);
 scanf("%ms", &lastName);
 scanf("%d", &pos);
 
 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
 tam1 = strlen(firstName);
 tam2 = strlen(lastName);
 // +1 pro caractere \0 do final
 tamanho = tam1 + tam2 + 1;
 printf("Tamanho total fullName: %lu chars\n", tamanho);
 fullName = malloc(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
 free(firstName);
 free(lastName);
 free(fullName);
 
 return 0;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!