elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  cadenas en c/c++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: cadenas en c/c++  (Leído 1,980 veces)
Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
cadenas en c/c++
« en: 19 Junio 2019, 00:19 am »

buenas chicos, tengo un problema al usar ciertas funciones como gets(); y cin.getline();
En este pasa que guarda mas de lo que debe
Código
  1. // Example program
  2. #include <iostream>
  3. #include <string.h>
  4. #include <conio.h>
  5. using namespace std;
  6. int main()
  7. {
  8.  char cadena[10], cadena2[10];
  9.  cout<<"Ingrese primer cadena: ";
  10.  gets(cadena);
  11.  cout<<"Ingrese segunda cadena: ";
  12.  gets(cadena2);
  13.  cout<<cadena<<endl;
  14.  cout<<cadena2<<endl;
  15. }

y en este solo sirve si uso una sola cadena en el rograma ero si dos y en la primera coloco mas de 10 caracteres la segunda guarda el enter y no me deja hacer mas bueno prueben los codigos no me se exlicar  :huh:

Código
  1. // Example program
  2. #include <iostream>
  3. #include <string.h>
  4. #include <conio.h>
  5. using namespace std;
  6. int main()
  7. {
  8.  char cadena[10], cadena2[10];
  9.  cout<<"Ingrese primer cadena: ";
  10.  cin.getline(cadena,10,'\n');
  11.  cout<<"Ingrese segunda cadena: ";
  12.  cin.getline(cadena2,10,'\n');
  13.  cout<<cadena<<endl;
  14.  cout<<cadena2<<endl;
  15. }

lo que quiero es ingresar mas de 10 caracteres y me tome solo 10 y me deje hacer lo mismo con  la segunda cadena colocar mas de 10 caracteres y me muestre por pantalla las dos cadenas con hasta 10 caracteres es decir 9 caracteres y el salto de linea  ;-)


En línea

7w7
@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.397


Turn off the red ligth


Ver Perfil WWW
Re: cadenas en c/c++
« Respuesta #1 en: 19 Junio 2019, 03:11 am »

Si te da igual el gasto de recursos yo haría así:
Código
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main()
  5. {
  6.  string cadena, cadena2, cadena3, cadena4;
  7.  cout<<"Ingrese primer cadena: ";
  8.  getline(cin, cadena);
  9.  cout<<"Ingrese segunda cadena: ";
  10.  getline(cin, cadena2);
  11. cadena3.append(cadena, 0, 10);
  12. cadena4.append(cadena2, 0, 10);
  13.  cout<<cadena3<<endl;
  14.  cout<<cadena4<<endl;
  15.  
  16. cin.get() //pausa
  17. return 0;
  18. }
/*Si le quieres meter saltos de linea usas otro append o un +=
cadena3.append("\n");
cadena4 += "\n";

Cumple exactamente lo que pides.
Puedes meter las variables en una función y te las cargas cuando la funcion se termina, ya sea haciendo el propio cout desde la funcion, o metiendo la llamada a la funcion en el propio cout.

Código
  1. void obtenerFrase();
  2.  
  3. int main()
  4. {
  5. obtenerFrase();
  6.  
  7. cin.get()
  8. return 0;
  9. }
  10.  
  11. obtenerFrases()
  12. {
  13. string a, b, c, d;
  14. cout << "blablabla" <<endl;
  15. getline(cin, a);
  16. cout << "blablabla" << endl;
  17. getline(cin,b);
  18. c.append(a, 0, 10);
  19. d.append(b, 0, 10);
  20. cout << "blabla : " << a <<endl <<"blabla" << b<<endl;
  21. }


Con el método append(); añades a un string el contenido de otro string.
El primer parámetro es un string, el segundo la posición a partir de la cual se van a emlezar a obtener letras. el tercer parámetro es cuantas letras vas a obtener a partir de la posición anterior.

Tienes otros métodos como:
.size() que te devuelve el tamaño del string
.length() hace lo mismo.
.max_size() te dice el número máximo de caracteres que puede tener tu string
.resize(numero, caracter) acorta o alarga. El primer argumento es el tamaño que tendrá el string, ek segundo argumento se aplica si alargas el string llenando de ese caracter el string hasta llegar al tamaño indicado. Ejemplo: mivariable.resize(50, '\0'); para llenar de espacios. Puedes usar variables como argumentos: int miInt = 50; char miChar='1'; mivariable.resize(miInt, miChar);
.capacity() te devuelve el el núneronde memoria destinada para el string.
.reserve(numero) aumenta el tamaño de memoria destinada como minimo al valor que le demos como parametro.
.shrink_to_fit() reduce la memoria destinada al valor mínimo posible sin perder contenido en el string.
.clear() borra lo que hay en el string y le pone el size() a 0. No necesariamente reduce la memoria destinada.
.empty() retorna true si el tamaño es igual a 0. Ejemplo:

while (miString.empty())
//toma valores hasta que al string se le meta algun valor.


A parte de esto, si estas trabajando con strings de C tambien puedes hacerles .append() para meterlos dentro de un string de C++:
a.append(stringDeC*);
Podrías hacer aritmética de punteros de forma manual para usarlo igual que use .append en el ejemplo:
a.append( (stringDeC*+5), 15);
Esto último no tengo comprobado que funcione, pero en teoría debería sumar a la direccion de memoria  apuntada por el puntero el numero 5 multiplicado por el tamaño en bytes del tipo de dato al que se apunta. En este caso sería un char que ocupa un byte * 5 que es el numero que sumamos.
En caso de ser un array de ints, se multiplicaría 4 bytes que ocupa el tipo int * 5 que es número puesto y se sumarían 20 bytes para encontrar el 4 elemento del array.

El tipo string de C es un array de chars que usa punteros y direcciones memorias contiguas + aritmética de punteros para saber donde están.

A medida que avances lo vas comprendiendo mejor.

Pd: Puedes usar string de C nativamente como tipo en C++ sin usar <string.h>
char* stringDeC = "El contendio";
cout << strlen(StringDeC) << endl;

Y usar bucles for para hacer lo que quieras:
for (int i = 0; i <strlen(StringDeC); ++i)
{
   if ( i == 7 )
   {
    StringDeC = '8';
    }
cout << StringDeC << endl;
}

Recuerda que los string empiezan en
  • no en [1] y que al final llevan el null terminator \0 que indica el fin del string.
También puedes trabajar directamente con punteros:
StringDeC*  es lo mismo que StringDeC[0]
Y (StringDeC* +5) es lo mismo que StringDeC[4]

Mírate el tema de los arrays y punteros.


« Última modificación: 19 Junio 2019, 03:31 am por string Manolo » En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: cadenas en c/c++
« Respuesta #2 en: 19 Junio 2019, 05:30 am »

No uses gets. Es una función insegura y oficialmente ya ni siquiera es parte del lenguaje, aunque los compiladores aún permitan usarla.

Pasando al otro código, no es que el segundo cin.getline almacene el Enter, sino que cuando introduces una cadena mayor a la especificada, cin queda en un estado de error, y no va a funcionar mientras no lo arregles. Por ejemplo, si aquí:

Código
  1. cin.getline(cadena,10,'\n');
introduces 10 caracteres o más, ocurre error, y cualquier intento de leer datos con cin (cin.getline(), cin >> variable, etc.) va a fallar, es decir, se saltará a la siguiente instrucción. La solución es que pongas esto inmediatamente después de cin.getline:

Código
  1. // Si el getline fallo:
  2. if (cin.fail()) {
  3.    // "Arreglar" cin
  4.    cin.clear();
  5.    // Opcional: descartar caracteres restantes en buffer. Incluir <limits>
  6.    cin.ignore(numeric_limits<streamsize>::max(), '\n');
  7. }

La última línea es por si quieres que el segundo cin.getline lea una cadena nueva. La función ignore lee y descarta caracteres hasta que haya leído la cantidad especificada en su primer parámetro, o hasta encontrar el caracter de su segundo parámetro. Es decir, esto:

Código
  1.    cin.ignore(20, '\n');

leería y descartaría del buffer hasta 20 caracteres o hasta encontrar una nueva línea, lo que suceda primero. El primer parámetro que yo usé en el ejemplo de arriba representa el tamaño máximo de un buffer de entrada/salida. Básicamente es decirle a ignore que limpie todo el buffer (por más grande que sea) hasta encontrar el´\n'.

Eso sí, sería mejor que usaras la clase string, como lo hizo string Manolo, en cuyo caso usarías la función global getline, que funciona un poco distinto a cin.getline, y en este caso específico lo  del estado de error no aplicaría como lo puse.
En línea

Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: cadenas en c/c++
« Respuesta #3 en: 19 Junio 2019, 05:57 am »

lo se RayR por eso pregunto, al rato lo pruebo  ;-)
En línea

7w7
codX

Desconectado Desconectado

Mensajes: 65


Es más complejo de lo que crees...


Ver Perfil
Re: cadenas en c/c++
« Respuesta #4 en: 3 Julio 2019, 04:42 am »

Beginner, la solución está en usar memoria dinámica
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Cadenas...
Programación Visual Basic
programatrix 3 2,091 Último mensaje 30 Diciembre 2005, 22:13 pm
por programatrix
cadenas
Programación C/C++
johrdy 8 4,864 Último mensaje 14 Febrero 2012, 19:03 pm
por Valkyr
Cadenas c++
Programación C/C++
jaimeramirez10 3 2,113 Último mensaje 11 Junio 2013, 16:38 pm
por CCross
Cadenas
Programación C/C++
monther 5 3,398 Último mensaje 4 Noviembre 2020, 04:34 am
por monther
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines