Buenas.
Estoy creando un programa que mediante una funcion y a partir de diferentes cadenas de texto me las una y me devuelva una unica cadena. Me da errores varios y esperaba aque me pudieran ayudar. Les paso el código.
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a,m;
const char* nombre[12];
a = '96';
m = '03';
nombre = nombre1(m,a);
printf("%s",nombre);
return 0;
}
const char* nombre1(char m, char a){
char nombre[12];
strcat(nombre,a);
strcat(nombre,"_");
strcat(nombre,m);
strcat(nombre,".15.txt");
return nombre;
}
Gracias por adelantado.
falta que inicialices nombre en 0 dentro de la funcion nombre1
char nombre[12]= "";
se podria hacer tambien con memset, o incluso solo el primer caracter.
Tambien deberias mirar
http://foro.elhacker.net/programacion_cc/cintroducir_una_cadena_en_un_char_ya_inicializado-t453643.0.html;new
http://foro.elhacker.net/programacion_cc/concatenar_cadenas_con_memoria_dinamica_en_lenguaje_c-t454083.0.html;msg2075787
[youtube=640,360]https://www.youtube.com/watch?v=mG8_nY3Yzg4[/youtube]
Otro dato que te falta es
a = '96';
m = '03';
Al ser char, solo pueden tener un caracter, si quieres que sean cadenas debe de ser comillas dobles. y declararlos como.
char *a = "96";
Y tambien la función deberia de ser
const char* nombre1(char *m, char *a){
Ya que las funciones de strcat solo trabajan con cadenas
Saludos
Buenas,
He leido lo que me dijiste y me ha servido de mucho, muchas gracias; aunque aun me quedaron aglunos errores y dudas. Te adjunto el nuevo codigo:
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#define dim 3
char *nombre1( char *m, char *a );
int main()
{
char a[dim] = "",m[dim] = "",d[dim] = "",*nombre2 = NULL;
int l;
setbuf(stdout, NULL);
printf( "dame la a: \n");
fgets(a, dim, stdin);
limpiarBuffer(a);
printf( "dame la m: \n");
fgets(m, dim, stdin);
limpiarBuffer(m);
nombre2 = nombre1(m,a);
printf("\n %s",nombre2); <--------------------- (1)
return 0;
}
char* nombre1(char* m, char* a){
size_t totCarac = strlen( m ) + strlen( a ) +8;
char *nombre = ( char* )malloc( totCarac * sizeof(char) );
nombre = strcat(a,"_");
nombre = strcat(nombre,m);
nombre = strcat(nombre,".15.txt");
printf("\n %s",nombre); <----------------- (2)
return nombre;
}
void limpiarBuffer( char cadena[] ){
char *p = NULL;
size_t ch;
if((p=strchr(cadena, '\n'))){
*p='\0';
}
else{
while((ch = getchar()) !='\n' && ch!=EOF);
}
}
La duda que tengo es referente a la funcion "LimpiarBuffer", es una funcion que copie de uno de los links que me pasaste y que me evita que me salgan ciertos saltos de linea y espacios que yo no le he especificado, pero realmente no entiendo mucho su funcionamiento, si puedieras explicarmelo te lo agradeceria.
A la hora de compilar, es curioso que en el printf que he marcado con un (2) me escribe perfectamente el string que yo quiero crear, de la forma que, suponiendo que a: 55 y m: 66, devuelve "55_66.15.txt", pero sin embargo, al escribirlo en el printf marcado con un (1) solo escribe "55_) a", y no consigo repararlo.
Gracias por adelantado.
Hola.
No tengo tiempo en este momento para explicarte soble esa función, pero fíjate que tiene mucho que ver con la imagen.
(http://i63.tinypic.com/35d6c5i.png)
Saludos.
El erro esta en que aunque si reservas memoria para el nombre en la función.
Posteriormente reasignas el apuntador de nombre al valor del buffer a.
Deberia de quedar asi.
char *nombre = ( char* )calloc( totCarac , sizeof(char) );
nombre = strcat(nombre, a);
nombre = strcat(nombre,m);
nombre = strcat(nombre,".15.txt");
printf("\n %s",nombre);
Hola.
void limpiarBuffer( char cadena[] ){
char *p = NULL;
size_t ch;
if((p=strchr(cadena, '\n'))){ //LB01
*p='\0';
}
else{
while((ch = getchar()) !='\n' && ch!=EOF); //LB02
}
}
/*
LB01
strchr busca un carácter dentro de una cadena, si lo encuentra devuelve la dirección en memoria
donde se encuentra el carácter , en este caso '\n' (Enter) si lo encuentra lo remplaza por '\0' que es el carácter que marca el final de cadena en C.
LB02
Si no lo encuentra es que en el buffer del teclado han quedado caracteres sin leer, con este bucle
y la función getchar el buffer queda limpio, sin nada pendiente de lectura.-
Faltaria explicarte que pasa si el buffer queda con pendientes pero eso lo tengo entendido pero no me da para explicartelo.
Saludos.
¡Gracias a todos por sus aportes, me han ayudado mucho!