• Viernes 3 de Mayo de 2024, 17:19

Autor Tema:  Funcionamiento Extraño De C En Linux Debian  (Leído 1816 veces)

soyyo

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Funcionamiento Extraño De C En Linux Debian
« en: Jueves 17 de Marzo de 2005, 17:49 »
0
Hola a todos estas últimos semanas me he estado mudando de windows a linux y todo bien excepto el c, no consigo que nada haga lo que espero que debería hacer, os pongo un ejemplo de código fuente y resultado a ver que opinais, gracias.
--------CODIGO--------
/* Created by Anjuta version 1.2.2 */
/* This file will not be overwritten */
#include <stdio.h>
 
int main(){
 char ipalabra[100]="Esta cadena\0";
 char comprovar="A";
 
 printf("%c - %s\n",comprovar,&ipalabra);
 printf("cambia la cadena de texto\n");
 scanf("%s",&ipalabra);
 //aqui voy a hacer una comprovacion, voy a poner un
 //fflush y un getchar y se lo pasa sin pulsar ninguna
 //tecla
 
 fflush(stdin);
 comprovar=getchar();
 printf( "\nHas elegido: %c", comprovar );
 fflush(stdin);
 printf( "\nHas elegido: %c", getchar() );
 fflush(stdin);
 printf( "\nHas elegido: %c", getchar() );
 fflush(stdin);
 printf( "\nHas elegido: %c", getchar() );
 
 
 return(0);
}
------------RESULTADO-------------
ø - Esta cadena //DE DONDE A SALIDO ESE "ø" , NO LO ENTIENDO.
cambia la cadena de texto
La cambio y pulso enter //DESDE AQUI EN ADELANTE NO PULSO NADA.
 
Has elegido:
Has elegido: c
Has elegido: a
Has elegido: m //AQUI FINALIZA EL PROGRAMA.
-----------OTRO CODIGO MAS SIMPLE------
#include <stdio.h>
 
int main(){
 char ipalabra[100]="Esta cadena\0";
 char comprovar="h";
 
 printf("%c - %s\n",comprovar,&ipalabra);
 //aqui voy a hacer una comprovacion, voy a poner un
 //fflush y un getchar y se lo pasa sin pulsar ninguna
 //tecla
 fflush(stdin);
 comprovar=getchar();
 printf( "\nHas elegido: %c", comprovar );
 fflush(stdin);
 printf( "\nHas elegido: %c", getchar() );
 fflush(stdin);
 printf( "\nHas elegido: %c", getchar() );
 fflush(stdin);
 printf( "\nHas elegido: %c", getchar() );
 
 return(0);
}
--------RESULTADO-------------
~ - Esta cadena //De donde sale ese caracter vacio si la varible era h
123456789 //yo aqui he escrito del 1 al 9 seguido y enter.
 
Has elegido: 1
Has elegido: 2
Has elegido: 3
Has elegido: 4
 
----------------------------------------
Gracias por vuestras ideas.

Gneuromante

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
    • http://www.canalada.org/
Re: Funcionamiento Extraño De C En Linux Debian
« Respuesta #1 en: Viernes 18 de Marzo de 2005, 00:07 »
0
El C tiene muchos recovecos de estos que le hacen poco portable. No le des más vueltas y reimplementa tu código en un lenguaje de más alto nivel.
Gneuromante.
Nos vemos en http].

fuhrer

  • Miembro MUY activo
  • ***
  • Mensajes: 329
  • Nacionalidad: mx
    • Ver Perfil
    • http://admin.busquenoseninternet.com
Re: Funcionamiento Extraño De C En Linux Debian
« Respuesta #2 en: Viernes 18 de Marzo de 2005, 00:35 »
0
Hola que tal.

Por lo que yo se en linux cuando utilizas getchar, te va almacenando todo lo que tecles hasta que oprimas enter, y como tu pones una palabra de varios caracteres, por eso te va imprimiendo los caracteres uno a uno, como en el segundo ejemplo que pusiste.

Ahora, cuando te pone un caracter raro al principio, es por que al momento de compilar te ha de marcar  un warning y esto es porque estas declarando un char y lo asignas "h" en vez de 'h', no se si eso funcione en windows, pero en linux no, es por eso que te sale ese error.

Bueno espero que hayas visto las diferencias que existen.

Cualquier otra duda pregunta.

Hasta luego.

rir3760

  • Miembro activo
  • **
  • Mensajes: 37
    • Ver Perfil
Re: Funcionamiento Extraño De C En Linux Debian
« Respuesta #3 en: Viernes 18 de Marzo de 2005, 16:50 »
0
Cita de: "Gneuromante"
El C tiene muchos recovecos de estos que le hacen poco portable.

Si un programador desarrolla una aplicacion basandose en implementation defined behaviour entonces por definicion el codigo fuente no es portable y esto no es problema de los estandares de C sino del programador en question.

Cita de: "Gneuromante"
No le des más vueltas y reimplementa tu código en un lenguaje de más alto nivel.

¿Trolling?

Cita de: "soyyo"
Hola a todos estas últimos semanas me he estado mudando de windows a linux y todo bien excepto el c, no consigo que nada haga lo que espero que debería hacer

Si piensas desarrollar aplicaciones que se ejecuten en mas de una plataforma te recomiendo que consigas material de referencia que se apegue de forma estricta al estandard de C, por ejemplo dos libros bastante buenos son:

The C programming language, 2nd edition
Pointers on C

Tambien puedes acceder a referencias en linea de la biblioteca estandard de C89 y C99

Por ultimo y por favor no me lo tomes a mal el codigo fuente del primer programa es bastante deficiente:

Código: Text
  1. int main(){
  2.  

No es un error pero es mejor utilizar int main(void) ya que la forma que utilizas no es soportada por el estandard C89.

Código: Text
  1. char ipalabra[100]=&#34;Esta cadena&#092;0&#34;;
  2.  

Tampoco es un error pero el caracter '\0' no es necesario.

Código: Text
  1. char comprovar=&#34;A&#34;;
  2.  

Tu compilador deberia de emitir un error ya que estas tratando de asignar a una variable de tipo char (comprovar) el agregado {'A', '\0'}.

Código: Text
  1. printf(&#34;%c - %s&#092;n&#34;,comprovar,&ipalabra);
  2.  

El operador 'direccion de' (el caracter &) no es necesario.

Código: Text
  1. fflush(stdin);
  2.  

fflush solo es para flujos (o streams) de salida.

Código: Text
  1. comprovar=getchar();
  2.  

Tampoco es un error pero hay que tener en cuenta que getchar devuelve un valor de tipo int y tu lo estas almacenando en una variable de tipo char.

Una solucion para evitar la situacion que describes es creando una funcion que lea una linea y utilizarla:

1 - leemos una linea con la funcion X
2 - verificamos el valor de retorno y las variables que modifica esta funcion
3 - Si se leyo una linea con exito continuamos
4 - procesamos esa linea de la forma que sea necesaria
5 - regresamos al paso uno

Un programa de ejemplo:

Código: Text
  1. #include &#60;stdio.h&#62;
  2. #include &#60;stdlib.h&#62;
  3.  
  4. int fn_Read_Line(char **line, size_t *num_chars);
  5.  
  6. int main(void)
  7. {
  8.    char *linea;
  9.    size_t num_chars;
  10.    
  11.    while (fn_Read_Line(&linea, &num_chars) && num_chars){
  12.      
  13.       printf(&#34;Linea:%s&#34;, linea);
  14.       printf(&#34;Longitud:%u&#092;n&#34;, num_chars);
  15.      
  16.       free(linea);
  17.    }
  18.    
  19.    return EXIT_SUCCESS;
  20. }
  21.  
  22. int fn_Read_Line(char **line, size_t *num_chars)
  23. {
  24.    const size_t block_size = 80;
  25.    
  26.    char *temp;
  27.    size_t i, block;
  28.    int c;
  29.    
  30.    *num_chars = 0;
  31.    if ((*line = malloc(block_size)) == NULL)
  32.       return 0;
  33.    
  34.    block = block_size;
  35.    for (i = 0; (c = getchar()) != EOF && c != '&#092;n'; i++){
  36.      
  37.       if (i == block-2){
  38.          block += block_size;
  39.          
  40.          if ((temp = realloc(*line, block)) == NULL)
  41.             return 0;
  42.          else
  43.             *line = temp;
  44.       }
  45.      
  46.       (*line)[i] = c;
  47.    }
  48.    
  49.    if (c == '&#092;n')
  50.       (*line)[i++] = '&#092;n';
  51.    (*line)[i] = '&#092;0';
  52.    
  53.    if ((*num_chars = i) == 0){
  54.       free(*line);
  55.       *line = NULL;
  56.    }
  57.    
  58.    return 1;
  59. }
  60.  

Un saludo
The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz

Gneuromante

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
    • http://www.canalada.org/
Re: Funcionamiento Extraño De C En Linux Debian
« Respuesta #4 en: Viernes 18 de Marzo de 2005, 19:21 »
0
Citar
Si un programador desarrolla una aplicacion basandose en implementation defined behaviour entonces por definicion el codigo fuente no es portable y esto no es problema de los estandares de C sino del programador en question.

El problema con C es que tiene demasiados implementation defined behaviour  y que es muy fácil caer en ellos. Desde luego que es problema del programador en cuestión, pero errar es de humanos, las máquinas (en este caso los compiladores) nos deberían ayudar a hacer nuestro trabajo sin preocuparnos continuamente de no caer en múltiples trampas.

Citar
Cita de: "Gneuromante"
No le des más vueltas y reimplementa tu código en un lenguaje de más alto nivel.
¿Trolling?

Vaale... un poquito, sí. Pero nuestro amigo entenderá ahora la importancia del tipado fuerte y de por qué el lenguaje no debería permitirle asignar un string a un char. ¿Por qué te deja el compilador hacer cosas que irremediablemente te conducen al abismo? Este tipo de cosas gastan el valioso tiempo del programador, cuando un sencillo mensaje de error le podía haber prevenido del (de hecho) su propio error.
Gneuromante.
Nos vemos en http].

Diabliyo

  • Miembro activo
  • **
  • Mensajes: 40
    • Ver Perfil
Re: Funcionamiento Extraño De C En Linux Debian
« Respuesta #5 en: Jueves 24 de Marzo de 2005, 18:34 »
0
Hola:

soyyo el problema esta en que tu programa NO debe usar esos scanf(), ya que scanf es para ler UN caracter o un CADENA sin espacio....

Sustituye asi:

Código: Text
  1. printf( &#34;TEXTO: &#34; );
  2. gets( var ); fflush( stdout );
  3.  
  4.  

y podras visualizar TODO lo introducido :D

en caso que queras usar a fuerzas SCANF... pues hazlo asi:

Código: Text
  1. printf( &#34;TEXTO: &#34; );
  2. scanf( &#34;%s&#34;, var );
  3.  

NOTA que no use el &.. ;)

byeeeeeeeeeee