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

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


  Mostrar Mensajes
Páginas: 1 ... 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 [44] 45
431  Programación / Programación C/C++ / Re: Problema con Manipulacion de Ficheros, ¿Cual es el error en mi codigo? en: 9 Noviembre 2015, 13:10 pm
En vez de usar la entrada con std::cin >>, te aconsejo usar la función std::getline:

Código
  1. std::getline(std::cin, nombreDelObjetoString);

No he comprobado que funcione.
432  Programación / Programación C/C++ / Re: Pasar de char* a string pérdida de datos en: 6 Noviembre 2015, 19:30 pm
Entonces, lo único que se me ocurre es que almacenes la cadena en un vector de chars:

Código
  1. std::vector<char> cData;
  2. const char *lpbyData = "aisjiajisfj\0buenas";
  3. size_t uNumCharacters = 19;
  4.  
  5. cData.reserve(uNumCharacters);
  6.  
  7. for(int i = 0; i < uNumCharacters; i++) {
  8.    cData[i] = lpbyData[i];
  9. }
433  Programación / Programación C/C++ / Re: Pasar cadena String a una variable Char en C++ en: 6 Noviembre 2015, 16:19 pm
Esta es la función con sus diferentes sobrecargas:

Código
  1. int compare (const string& str) const noexcept;
  2. int compare (size_t pos, size_t len, const string& str) const;
  3. int compare (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen) const;
  4. int compare (const char* s) const;
  5. int compare (size_t pos, size_t len, const char* s) const;
  6. int compare (size_t pos, size_t len, const char* s, size_t n) const;

Las que te interesaría son:

Código
  1. int compare (const char* s) const;
  2. int compare (size_t pos, size_t len, const char* s) const;
  3. int compare (size_t pos, size_t len, const char* s, size_t n) const;

Argumentos (Copiado de la página de antes):

Código:
str
Another string object, used entirely (or partially) as the comparing string.
pos
Position of the first character in the compared string.
If this is greater than the string length, it throws out_of_range.
Note: The first character is denoted by a value of 0 (not 1).
len
Length of compared string (if the string is shorter, as many characters as possible).
A value of string::npos indicates all characters until the end of the string.
subpos, sublen
Same as pos and len above, but for the comparing string.
s
Pointer to an array of characters.
If argument n is specified (4), the first n characters in the array are used as the comparing string.
Otherwise (3), a null-terminated sequence is expected: the length of the sequence with the characters to use as comparing string is determined by the first occurrence of a null character.
n
Number of characters to compare.
434  Programación / Programación C/C++ / Re: Pasar cadena String a una variable Char en C++ en: 6 Noviembre 2015, 15:11 pm
Si, está mal declarada. Cuando declaras un array al estilo C, no puedes usar variables para delimitar el tamaño. En todo caso, tendrías que hacer esto:

Código
  1. char *PalabraAdivinarChar = new char[PalabraAdivinar.size()];

Lo segundo, es que no puedes hacer esta asignación (no puedes asignar a un puntero char un objeto string):

Código
  1. PalabraAdivinarChar = PalabraAdivinar;

Tendrías que hacer esto:

Código
  1. const char *PalabraAdivinarChar = PalabraAdivinar.c_str();

Date cuenta de que no he creado un array (sería inútil), sino un puntero a una cadena.

Y lo tercero y último. Puedes comparar cadenas sin tener que usar esa función. En vez de eso, usa el método compare, de la clase std::string:

y = PalabraAdivinar.compare(Respuesta);

Si y vale 0, entonces las cadenas son iguales, y si es distinto de 0, es que no son iguales. Para ser más exacto, mira esta página:

http://www.cplusplus.com/reference/string/string/compare/
435  Programación / Programación C/C++ / Re: Pasar de char* a string pérdida de datos en: 6 Noviembre 2015, 12:10 pm
Lo que delimita el tamaño de una cadena de caracteres es precisamente el carácter nulo. Si no hubiera un carácter nulo, entonces no sabríamos cual es el tamaño de la cadena. Entonces, cuando un objeto de tipo std::string toma los datos, lo hace hasta que encuentra un carácter nulo (repito, no hay otra forma segura de hacerlo). Lo único que puedes hacer es saber a ciencia cierta el tamaño de la cadena (el tamaño podría estar almacenado en una variable, por ejemplo). Una vez sabido esto, podrías reemplazar todos los caracteres nulos por otro carácter a tu elección:

Código
  1. std::string cString;
  2. char *lpbyData = "aisjiajisfj\0buenas";
  3. size_t nNumCharacters = 19; // No contamos el carácter nulo del final
  4.  
  5. for(size_t i = 0; i < nNumCharacters; i++ {
  6.    if(lpbyData[i] == '\0')
  7.        lpbyData[i] = '~'; // Pon el carácter de tu elección
  8. }
  9.  
  10. cString = lpbyData;
436  Programación / Programación C/C++ / Re: Hacer dos comprobaciones en un WHILE con funciones en: 5 Noviembre 2015, 16:01 pm
Pero si te acabo de mostrar como validad que es un entero lo introducido :P

Esta es la secuencia:

1º- Mostramos el mensaje que nos pide el número
2º- Comprobamos que no hay errores de datos (es la parte del if)
     2.1º- En caso de error, limpiamos el buffer
3º- Pedimos datos, y empezamos el ciclo de nuevo si ha habido algún error (la condición del while)

Para comprender mejor como funciona la introducción de datos, te paso un tema mío donde lo explico con un diagrama de flujo:

http://foro.elhacker.net/programacion_cc/aporte_diagrama_de_flujo_del_operador_stdcin_stdistream-t443774.0.html
437  Programación / Programación C/C++ / Re: Validar solo números en un INT en C++ en: 5 Noviembre 2015, 12:31 pm
Cuando haces esto 'cin >> NumeroLetras;', siendo NumeroLetras un entero, directamente se guarda como un entero, es decir, ya es un número (no necesitas comprobar nada). Lo que tendrías que comprobar es si a la hora de introducir el número, se ha introducido correctamente. Eso se puede hacer (después de 'cin >> NumeroLetras;') viendo si std::cin.fail() retorna true o false. Si retorna true, entonces el número introducido no era correcto (se han introducido decimales, o caracteres, o el número es demasiado grande o pequeño). Si retorna false, eso significa que no ha habido ningún error.

NOTA: Si ha habido un error, tienes que limpiar el buffer que maneja std::cin. Esto lo puedes hacer así:

Código
  1. if(std::cin.fail()) {
  2.    std::cin.clear();
  3.    /*Comunicas que ya has verificado los errores. A partir de esta linea es como si no
  4.     hubieran ocurrido, aunque en un futuro es posible que ocurran mas*/
  5.  
  6.    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  7.  
  8.    /*Si el parametro vale exactamente std::numeric_limits<std::streamsize>::max(),
  9.     entonces se ignora todo hasta el caracter fin de línea*/
  10. }
438  Programación / Programación C/C++ / Re: Hacer dos comprobaciones en un WHILE con funciones en: 5 Noviembre 2015, 08:33 am
En primer lugar, cuando llamas a la función ValidarNumeroIngresado(NumeroLetras), lo que haces es comprobar que el primer carácter sea un dígito. No compruebas que toda la cadena sea un número. Lo segundo, que para convertir la cadena en un entero, es mejor usar la función strtol, pues si hay algún error, será más previsible. En tercer lugar, ¿por qué no pides directamente un entero?

Código
  1. do {
  2.    std::cout << "N\243mero de letras de la palabra: ";
  3.  
  4.    if(std::cin.fail()) { // Comprobamos si hay errores de entrada
  5.        std::cin.clear();
  6.        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Limpiamos el buffer manejado por la clase std::cin
  7.    }
  8.  
  9.    std::cin >> nNumLetters;
  10. } while(std::cin.fail());

La variable nNumLetters es de tipo int

Te aconsejo mirar el tema que publiqué hace poco sobre el funcionamiento del operador std::cin>> para una mejor comprensión del código.

http://foro.elhacker.net/programacion_cc/aporte_diagrama_de_flujo_del_operador_stdcin_stdistream-t443774.0.html
439  Programación / Programación C/C++ / Re: Mostrar mensaje en ventana C++ en: 3 Noviembre 2015, 10:04 am
Cuidado con:

Código
  1. lpszWideMessage = new wchar_t[uMessageSize * sizeof(wchar_t)];

El sizeof no se necesita para ese caso. Ahí estás creando una cadena del doble de tamaño.
Y hay que poner caracter nulo.

Código
  1. lpszWideMessage = new wchar_t[uMessageSize + 1];
  2. for(size_t i = 0; i < uMessageSize; i++)
  3.    lpszWideMessage[i] = (wchar_t)lpszMessage[i];
  4. lpszWideMessage[uMessageSize] = '\0';

Es cierto lo del sizeof... Que despiste tengo encima XD. También tengo que reafirmar lo del carácter nulo :S Siento los errores
440  Programación / Programación C/C++ / Re: Ayudeme problema con validacion corre perfecto en: 3 Noviembre 2015, 03:14 am
El no quiere recibir una cadena... quiere recibir un carácter. Scanf no es malo para los string, solamente tienes que tener cuidado de que no recoge la línea entera, sino una palabra (las palabras están delimitadas por espacios)
Páginas: 1 ... 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 [44] 45
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines