Ir ao conteúdo
  • Cadastre-se

C problema em concatenar strings em C


JVGS1111

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
Link para o comentário
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
Link para o comentário
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
Link para o comentário
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
Link para o comentário
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.

Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!