¡Hola! Edité tu post para que el foro haga Syntax Highlighting (o sea, que pinte de colores el código). Para eso basta con poner tres comillas hacia atrás (" ` ") al comienzo del código, y luego tres más al final. Se pueden ver otros tips de cómo lograr formatos simpáticos en el foro, en este tema: Formato y Escritura en el Foro
Sobre el código: El tema está en el fragmento mensajev2.substr(i, i+(p-1));
: En esa parte, el segundo parámetro a substr en C++ tiene que ser la cantidad de caracteres a seleccionar, es decir, la longitud de la subcadena. Esto es a diferencia de algunos otros lenguajes (Notablemente, Java y Python). Acá se puede consultar el funcionamiento de la función substr (y muchas otras) http://www.cplusplus.com/reference/string/string/substr/
En este caso, no creo que funcione en todos los casos menos en el que describís, sino que es medio al azar en cuáles funciona y en cuáles no, porque por cómo llamás a la función, se terminan comparando subcadenas muy raras :P. Algo con lo que quizás debas tener cuidado es con la posibilidad de que la cadena aparezca más de una vez (como por ejemplo "abc"
dentro de "abcabcabc"
).
Sobre el código, un detalle es que no hace falta (pero como está funciona y no tiene nada mal) tener separado el vector<char> mensaje;
, porque solamente lo usás para tener un caracter individual mensaje[i]
durante la construcción del string mensajev2
. Con lo cual podrías usar una sola variable local de tipo char
adentro del for, para leer ese caracter y agregarlo al string (ya que ahí adentro es el único lugar donde se usa el vector mensaje, y se usa siempre de a un caracter por vez).
Comentario aparte: en este programa de una competición vieja se especifica que hay que leer y escribir de archivos. Esto es prácticamente igual a leer y escribir los datos con cin
y cout
: en el curso básico de C++ de la wiki está explicado:
wiki.oia.unsam.edu.ar/curso-cpp/archivos