Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - rir3760

#201
Cita de: francoyo1998 en 30 Octubre 2014, 22:04 PMy ese while al final y simple??? porque no tiene nada adentro?
Porque en C es obligatorio indicar el cuerpo de un bucle.

En el caso que comentas:
{
   int ch;
   
   while ((ch = getchar()) != EOF && ch != '\n')
      ; /* sentencia nula ==> ninguna operacion */
}

La operación necesaria (descarte del resto de la linea) se realiza en la condición del bucle, no hay nada mas que hacer pero las reglas del lenguaje imponen indicar el cuerpo si o si. Por ello utilizamos una sentencia nula (nada) la cual se indica con el punto y coma inmediatamente después de la condición.

----

Cita de: leosansan en 31 Octubre 2014, 04:39 AMscanf("%[^\n]%c" , temp);

Espero no haberte liado más, sino todo lo contrario y no haber metido la pata con la explicación
Toda la explicación es correcta salvo un detalle en esa llamada a función: al utilizar "%c" se debe indicar mediante un puntero la variable donde se almacenara el carácter, si se desea simplemente descartar al susodicho se debe utilizar "%*c".

Un saludo
#202
Algunos comentarios ...

Cita de: engel lex en 30 Octubre 2014, 02:00 AMtambien
fseek(stdin,0,SEEK_END);
que usa la busqueda para en el buffer de entrada (stdin) pararse al final
El problema con fseek es que tal vez funcione o tal vez no, mejor utilizar un bucle para descartar el resto de la linea:
{
   int ch;
   
   while ((ch = getchar()) != EOF && ch != '\n')
      ;
}

Se debe comparar contra EOF para evitar el caso donde la función getchar falla, retorna EOF y ello resulta en un bucle infinito.


Cita de: leosansan en 30 Octubre 2014, 13:37 PM
* Si quisieras seguir usando scanf para captar la cadena con espacios usarías:

scanf("%[^\n]s", temp) ;
Cuando se desea indicar un conjunto de caracteres el especificador de formato es "%[]", la 's' después de este no hace daño pero esta de mas.


Cita de: engel lex en 30 Octubre 2014, 14:37 PMleosansan yo intenté eso pero me dice que ^\n no fue reconocido :s por eso ni lo intenté
Si estas compilando el código fuente como C debería reconocerlo, es la forma de indicar que los caracteres validos son los distintos al conjunto indicado.


Cita de: _Enko en 30 Octubre 2014, 15:09 PMDigo mas que nada porque el bucle infinito me parece como mala práctica.
Depende del programa si un bucle infinito es valido o no.

Un saludo
#203
Solo agregar que la condición de la sentencia de selección if esta mal ya que divide por "div" (una variable no declarada):
if ((N % div) == 0){
Para solucionarlo se debe dividir por el contador del bucle "i":
if ((N % i) == 0){

Un saludo
#204
Cita de: T. Collins en 28 Octubre 2014, 02:08 AMPorque para usar strcmp, strcpy etc tienes que incluir #include <string.h>
Cierto, falta ese encabezado.

Cita de: T. Collins en 28 Octubre 2014, 02:08 AMy has utilizado mal "strncpy" porque solo admite dos argumentos.
La función strncpy es parte de la biblioteca estándar de C.

Un problema con ella es que copia los caracteres del origen al destino, como máximo los indicados por su tercer argumento pero si copia ese máximo no agrega el terminador de cadena '\0', en su lugar se puede utilizar la función sprintf en la forma:
/* strncpy(current_instruction, current_line, 16); */
sprintf(current_instruction, "%.*s", 15, current_line);


Un saludo
#205
Lo primero que debes hacer es evitar el uso de la biblioteca conio de Borland, las razones de ello se explican en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Ademas:

* Hay que cambiar el nombre del encabezado <string.h> ya que el nombre correcto es <cstring>, eliminar la variable "i" ya que no la utilizas en el programa y acortar algunas partes, por ejemplo este bloque:
Código (cpp) [Seleccionar]
char palabra[20];

strcpy (palabra,"argentina");
entrada<<palabra<<endl;
entrada.close();

Se puede reducir con el mismo efecto a solo:
Código (cpp) [Seleccionar]
entrada << "argentina" << endl;
entrada.close();


* Si no utilizas los argumentos pasados mediante la linea de comandos cambia la definicion de la funcion principal a "int main() ...".

* Hay que cambiar los nombres de las variables para el manejo de archivos ya que abren la puerta a errores lógicos, esto porque el archivo de salida (a donde envías los datos) se llama "entrada" mientras que el archivo de entrada (leer los datos del archivo) se llama "salida".

* Debido a la forma del bucle donde lees e imprimes las palabras la primera se descarta (no se imprime):
Código (cpp) [Seleccionar]
getline(salida,palabra);
while (!salida.eof()){
   getline(salida,palabra);
   cout<<palabra<<endl;
}

Para corregirlo basta con utilizar el valor de retorno de la función getline:
Código (cpp) [Seleccionar]
string palabra;
while (getline(salida,palabra))
   cout<<palabra<<endl;


----

En cuanto a la impresión de una palabra al azar leída del archivo lo primero que debes hacer es ... enviar mas de una palabra al archivo, por ejemplo con:
Código (cpp) [Seleccionar]
} else {
   entrada << "Hugo" << endl;
   entrada << "Paco" << endl;
   entrada << "Luis" << endl;
   entrada.close();
   
   cout<<"Los datos fueron almacenados correctamente\n"<<endl;
}


A continuación lees cada una de las lineas y las almacenas en un vector de cadenas utilizando las clases vector y string, los encabezados a incluir son <vector> y <string>. Para seleccionar una utilizas la funciones srand y rand. Mas o menos así:
Código (cpp) [Seleccionar]

int main()
{
   srand((unsigned) time(0));
   
   // ...

   } else {
      vector<string> palabra;
      string aux;
      while (getline(salida, aux))
         palabra.push_back(aux);
     
      int i = rand() % palabra.size();
      cout << palabra[i] << endl;
   }
   salida.close();


Un saludo
#206
Cita de: ShadowA7X en 28 Octubre 2014, 00:03 AMRecomendación personal amigo. Siempre cuando estés leyendo muchas cadenas de caracteres ocupa
fflush(stdin);
El uso de fflush(stdin) no se recomienda, las razones de ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Un saludo
#207
Programación C/C++ / Re: Ayuda en C++
27 Octubre 2014, 02:02 AM
Cita de: ShadowA7X en 26 Octubre 2014, 21:47 PMalgo como:

char num_en_caracteres[10];
int num=2437;
int cant_dig;

num_en_caracteres[10]=atoi(num) //Atoi transforma un numero a cadena.
No funcionara porque los indices validos del array son [0, 9], el operador de asignación "=" no puede utilizarse con arrays y porque el valor de retorno de la función atoi es de tipo int.

Si lo que quieres es almacenar cada uno de los dígitos del numero en el array (como los caracteres '0' .. '9') puedes utilizar la función sprintf, de esta forma:
sprintf(num_en_caracteres, "%d", num);
Con el detalle de ser una forma mas propia de C que de C++, con este ultimo lo primero que se me ocurre es utilizar las clases string y stringstream.

Un saludo
#208
Programación C/C++ / Re: consejos sobre programa
27 Octubre 2014, 01:47 AM
Cita de: novatus84 en 26 Octubre 2014, 20:42 PMEl problema que tengo ahora es al meter el valor erróneo de a == letra, he puesto un break para acabar el programa, realmente quiero que me vaya al loop de while para volver a empezarlo de nuevo, como lo puedo hacer? lo mismo con b y c.
Solo tienes que colocar la lectura y validación de cada variable en un bucle, dos ejemplos de ello en los temas que mencione en mi primer mensaje.

Pero si piensas utilizar el operador ">>" debes descartar el resto de la linea con la función sync o ignore, ejemplos de ambas los puedes consultar mediante el motor de búsqueda de los foros.

Un saludo
#209
Programación C/C++ / Re: consejos sobre programa
26 Octubre 2014, 15:52 PM
Cita de: novatus84 en 26 Octubre 2014, 13:31 PMcomo puedo conseguir que el usuario no pueda meter letras para que de un error
En C++ estándar no puedes bloquear la pulsación de teclas, para ello debes utilizar una biblioteca de terceros o el API del SO.

En su lugar lo que puedes hacer es leer una linea de texto y validar su contenido, dos temas sobre ello son:
duda c++
Leer un char como float

Un saludo
#210
El programa debe funcionar correctamente si agregas al principio de este las directivas de inclusión:
#include <stdlib.h> /* srand y rand */
#include <time.h>   /* time */


Y no es necesario que incluyas <string.h>, en cuanto a conio la deberías evitar por las razone que se indican en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Un saludo