Limpiar cadenas en c++?

Riu

Bueno tengo un problema , al estar recorriendo un array de vectores tengo que guardar 2 cadenas de caracteres y la primera se ve bien , pero las demas llevan basura incrustada, he intentado usar fflush(stdin), despues de cada asignacion, pero sin exito, y como no puedo usar - Variable = null - o - Variable = ' ' - pues me rayo y no encuentro solucion, alguno podria hecharme una mano. pongo algo de codigo por si no se entiende..


for(int i=0;i<numalum;i++){
                         cout<<"\nIntroduce el nombre del Alumno :";
                                cin>>nombre;

                            cin.getline(nombre2,20);
                            strcat(nombre,nombre2);
                            strcat(alumnos[i].nombre,nombre);
                          //aqui haria el fflush(stdin); pero sin exito...



LOc0

No entiendo muy bien qué quieres hacer, pero para leer nombre y apellidos de una vez puedes probar con:

//Siendo MAX_NOMBRE el tamaño que le hayas dado en la estructura a [i]char alumnos.nombre[][/i]

for(int i=0; i<numalum; i++)
{
     cout<<"\nIntroduce el nombre del Alumno: ";
     
cin.getline(alumnos[i].nombre, MAX_NOMBRE); }

Salu2 ;)

NeB1

strcpy(cadenaquequiereserlimpiada, "");

Riu

#2 si te fijas tengo 2 variables de tipo cadena
nombre y nombre2. la primera vez que las lleno funciona pero la segunda queda restos de la anterior y asi sucesivamente, con lo que salen valores extraños en la salida ..

Poisonous

si es c++ usa strings que al asignar un nuevo valor ya se limpian solos

NeB1

#4 a mi me pasaba igual en otro programa y lo solucione con un stringcopy de la cadena vacía:

strcpy(cadena,"");

Riu

#3 no funciona. #6 pega un trozo de codigo pq vamos lo estoy haciendo con la funcion de copiado y nada que no quiere xdd
#5 error, no puedes asignar valores a cadenas.

LOc0

Lo que te pasa no tiene mucho sentido pero prueba con:

memset(nombre, 0, MAX_LONGITUD);
memset(nombre2, 0, MAX_LONGITUD);

antes de leerlas.

De todas formas, ¿por qué usas strcat(alumnos.nombre,nombre);?

SI quieres asignar el valor de nombre a alumnos.nombre usa

strcpy(alumnos.nombre,nombre);

ya que en alumnos.nombre NO hay "nada" y strcat necesita encontrar el '\0' para poder concatenar.

Salu2 ;)

Riu

#6 llevavas razon , tenia algo mal escrito en el codigo y no me estaba dando cuenta ;D
#8 lo estaba usando para otra cosa y se me olvido cambiarlo, yo creia qu estaba con strcpy , me he dado cuenta tras mirar bien el codigo ...

Soleil

En C++...

string str ("Hola mundo");
str.clear();

En C...

char str[] = "Hola mundo";
*(str) = 0;

(aunque ésto sólo colocará el terminador \0 al primer carácter
así que lo de memset(str, 0, longitud) es más limpio)

Poisonous

#7 veo que no sabes lo que es un string

Riu

#11 una variable cadena no se le puede asignar directamente un valor tipo variable =""; . por que te da un error ahi que hacerlo con las funciones de cadena STR como strlen,strcpy,strcat. Y si se que es una cadena pero en c no se trabajan igual que con visual studio,.net,java,etc,etc..

maRc

#12, estás mezclando cosas de C y C++, que son dos lenguajes diferentes.

En C no existen cadenas, lo más que se le acerca son vectores de caracteres (ej char cadena[10]) y las funciones que dices de strlen y todo eso.

En C++, que comparte muchas cosas con C (de ahí el nombre :P) pero no todas, si que existe la clase string a la que si que le puedes asignar un valor con el =.

Por ejemplo, en #1 estás utilizando la manera de usar cadenas en C y la entrada estandar la haces con C++ (el cin).

cabron

#12:

"pero en c no se trabajan igual que con visual studio,.net,java,etc,etc.."

¿Desde cuándo visual studio es un lenguaje de programación?. Y como te ha dicho #13, no son lo mismo las cadenas de C que los Strings de C++, lenguajes que estás mezclando de manera incoherente en el mismo código fuente.

Tienes un cacao de 3 pares de cojones, mezclas C con C++ y afirmas rotundamente sin saber de que hablas.

Todo esto tendría perdón (todos hemos sido novatos), si no fuese por que todavía recuerdo

unos posts tuyos

en los que contestabas con una prepotencia tremenda como si fuese el number one, y resulta que no tienes ni ciertas nociones básicas de las herramientas con las que trabajas.

Si ya lo dice el refrán, dime de que presumes y te diré de que careces.

JuAn4k4

En C para limpiar basta con hacer : str[0] = "\0"; En C++ imagino que el tipo String sera mucho mas comodo de usar, y sera del tipo str = "";

De todas formas tus errores son de programacion, no de limpiar cadenitas. ¿ Realmente sabes lo que hace fflush(stdin) ? Porque vamos.... no se que esperabas que te solucionara.. ¿ Que te limpiara la variable alumno ? ¿ Que te limpiara algun buffer de alguna funcion que no usas ?



#14 Hombre, en teoria, puedes programar al estilo C aunque luego compiles con compiladores para C++, que muchas veces no se quejaran.

Riu

#14 en ningun momento me he referido a lenguajes de programacion. hemos de partir de ahi, me refiero a la plataforma ide donde se programa, y el lenguaje que estas puedan utilizar, yo en concreto estoy utilizando dev c++ y borland c, y prepotencia ninguna sacas de contexto las cosas, solo poniendo lo que te interesa, el chaval pregunto que iba a hacer esto o lo otro yo solo le di una recomendacion de lo que iba a hacer yo y lo que pensaba de lo que iba a hacer el.
#14 puedo aceptar que me pueda equivocar, pero no que leyendo el codigo y que estoy usando el tipo char y no string , ya creo que vamos se entiende que no se puede asignar valores por que no es c++, es c y como bien dice #13 lo mas parecido a un string en c es un vector de caracteres. Desde mi humilde opinion ademas de las entradas y salidas en c++ y c la mayor diferencia en estos lenguajes es oop o al menos creia yo eso , esta bien aprender todos los dias cosas nuevas , aunque vengan #14 a recordar que la gente sabe menos que el y que tiene que ser el centro de atencion ;).

#15 limpia la memoria asignada a las entradas, creo, si tu puedes explicarmelo mejor..

MTX_Anubis

#16 en mi vida he usado el fflush() pero en opengl el glFlush() lo que hace es mandar que se pinte lo que quede en el buffer. Me imagino que el fflush mandará a pantalla o donde sea lo que haya en el buffer i/o.

Riu

#17 yo lo busque por google, y segun decia fflush funcionaba para borrar la memoria asignada, pero creo que no era lo que yo me imaginaba que era, o yo no supe aplicarlo por que no lo comprendia, pero lo que decian es que usando fflush(stdin); borrabas la memoria asignada a las entradas.
yo tampoco habia usado el fflush, recuerdo que en punteros lo hacia con delete *[] variable; , pero ahora me encontre haciendo esta practica y no recordaba como hacerlo de otra manera..

maRc

fflush vuelca los datos de/a un fichero que puedan estar en el buffer. Si le pasas un fichero, será de ese fichero, si le pasas NULL, de todos los abiertos. La e/s estandar se considera un fichero.

#18, tienes un cacao mental enorme.

Riu

#19 relee he dicho, #18 que yo me imagine, no que esto fuera asi, de todas maneras el ejemplo lo hacia orientado a ficheros y sin ficheros asi que me imagine que podia servir.. ahora si tu me dices que funciona asi , pues muchas gracias :P

http://www.conclase.net/c/librerias/funcion.php?fun=fflush
y ahora te adjunto la respuesta de una persona que me dio la idea de usar fflush..
http://foro.hackhispano.com/archive/index.php/t-4506.html
comentario de:

NeoGenessis
02-oct-2002, 18:16
La respuesta del fflush es para vaciar el buffet de entrada y/o salida por defecto, tanto de pantalla, como de teclado como ficheros. Era necesario en Ms-Dos y solo en algunos casos (dependia de las funciones usadas). De todas formas si programas para linux puede serte necesario.

Yo entendi por esto que podia limpiar la memoria usada en las entradas(cin). pero no se, aclaralo tu por que no me quedo claro aun..

Puni

y digo yo, con lo maravillosa q es la clase string de c++ con todos sus operadores sobrecargados y su facilidad de uso pa q cois quieres rabilar con char* ? con lo bonito q es un + pa concatenar y lo asqueroso q es el strcat p.ej...

Riu

#21 exigencias del profesor de turno.. vamos requisitos..

JuAn4k4

fflush limpia un buffer (volcandolo por la salida correspondiente ), ¿ Lo usas ( el buff ) ? ¿ cin lo usa ? La respuesta a esta ultima pregunta no la se, pero vamos no creo ( que no estoy seguro ) que cin y cout usen ninguna clase de buffer relacionada con fflush ( puede haber multiples buffers diferentes ).

Si quieres probarlo, puedes hacer un par de pruebas, pones un cout con alguna cadena sin \n y seguidamente haces que explote el programa, por ejemplo le haces que asignarle a la direccion de un puntero nulo un valor, si pinta por pantalla no hay buffers por en medio, si no pinta, ponle fflush a ver si pinta, si esta segunda vez no pinta es que el fflush no hace nada con los buffers de cin/cout , si pinta, entonces usa el mismo buffer.

Y despues lo mismo con fflush por en medio a ver.. y nos cuentas.

for(int i=0;i<numalum;i++){

cout<<"\nIntroduce el nombre del Alumno :";

cin>>alumnos.nombre;

cin.getline(alumnos.nombre[(strlen(alumnos.nombre)+1)],20);

Usuarios habituales

  • JuAn4k4
  • Riu
  • maRc
  • MTX_Anubis
  • Poisonous
  • LOc0
  • NeB1