[ Foro de C ]

Código programación

23-Mar-2021 17:57
Ismael Millán Pérez
2 Respuestas

Hola. Soy estudiante de grado superior de informatica. Y he hecho este código, las funciones 0 1 2 y 3 funcionan, pero la 4 no, siempre que la ejecuto me resulta en el terminal lo siguiente: 'Violacion de segmento'. No se concatenan las cadenas. ¿Alguna solución posible?

#include <stdio.h>
#define num  40
int strlen1 (char s[num]);
void strcpy1 (char destino[num], char origen[num]);
int strcmp1 (char s1[num], char s2[num]);
void strcat1 (char destino[num], char origen[num]);
void main(){
int op=1,res,i=0;
char s[num], destino[num], origen[num], s1[num], s2[num];
while(op!=0){
printf("Seleccione una opción\n");
printf("0 - Salir del programa\n");
printf("1 - Cuenta los caracteres de una cadena\n");
printf("2 - Copia los caracteres de una primera cadena a otra\n");
printf("3 - Compara 2 cadenas de caracteres\n");
printf("4 - Concatena 2 cadenas\n");
scanf("%d", &op);
getchar();
switch(op){

case 0: printf("Adiós\n");
break;

case 1: printf("Introduce una cadena de caracteres\n");
scanf("%[^\n]",s);
res=strlen1(s);
printf("La longitud de la cadena es %d caracteres\n", res);
break;

case 2: printf("Introduce una cadena de caracteres\n");
scanf("%[^\n]",origen);
strcpy1(destino,origen);
printf("Las 2 cadenas de caracteres copiadas: %s\n",destino);
break;

case 3: printf("Introduce una primera cadena de caracteres\n");
scanf("%[^\n]",s1);
getchar();
printf("Introduce una segunda cadena de caracteres\n");
scanf("%[^\n]",s2);
res=strcmp1(s1,s2);
if (res==0) {
printf("%d, Las 2 cadenas son iguales\n", res);
}
else {
if (res<0){
printf("%d, la primera cadena es menor que la segunda\n", res);
}
else{
printf("%d, la primera cadena es mayor que la segunda\n", res);
}
}
break;

case 4: printf("Introduce la cadena de origen\n");
scanf("%[^\n]", origen);
getchar();
printf("Introduce la cadena de destino\n");
scanf("%[^\n]", destino);
getchar();
strcat1(destino,origen);
printf("El resultado de la unión es este: %s\n", destino);
break;

default: printf ("Opción no contemplada\n");
}
}
}

int strlen1 (char s[num]){
int i=0,cont=0;
while (s[i]!='\0'){
i++;
cont++;
}
return (cont);
}

void strcpy1 (char destino[num], char origen[num]){
int i=0;
while (origen[i]!='\0'){
destino[i]=origen[i];
i++;
}
}

int strcmp1 (char s1[num], char s2[num]){
int i=0, resta=0;
while(s1[i]==s2[i] && s1[i]!='\0' && s2[i]!='\0'){
i++;
}
if(s1[i]!=s2[i]){
resta=s1[i]-s2[i];
return(resta);
}
else if (s1[i]==s2[i]){
resta=0;
return(resta);
}
}

void strcat1 (char destino[num], char origen[num]){
int i=0,j=0;
while (origen[i]!='\0'){
i++;
}
while (destino[i]!='\0'){
destino[i+j]=origen[j];
j++;
}
destino[i+j]='\0';
}


24-Mar-2021 06:53
Invitado (cgamezca)

Tienes la variable "i" donde debe ser la variable "j".
La instrucción "while (destino[i]!='\0'){" debe ser "while (destino[j]!='\0'){".


24-Mar-2021 19:33
Invitado (ramon)

hola ismael

básicamente te has liado bien jajja

en strcat1
* vas la final de origen cuando debes ir al final
de destino
* compruebas si has copiado hasta el final de destino
cuando tienes que comprobarlo de origen
* además el indice del segundo while debe ser j y no i

* también el concepto de origen y destino al pedir las
cadenas, ya que la primera que recoges debe ser destino
que es a la que se sumará la cadena origen

de lo contrario sumará en la segunda cadena la
primera y debe ser al revés

otras mejoras

* también te recomendaría el int main(void) que es lo
que dice la norma, con su return 0 al acabar

* en strcmp1 después del bucle while puedes poner
return s1[i]-s2[i]; y te ahorras todo lo demás

* la variable i de comienzo de main no la utilizas o
eso dice el compilador

saludos ;-)






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)