Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Punteros en C

Estas en el tema de Punteros en C en el foro de C/C++ en Foros del Web. Hola a todos, estoy empezando en C (luego me meteré en C++) y estoy practicando con unos ejercicios que he encontrado por ahí. Ahora mismo ...
  #1 (permalink)  
Antiguo 15/09/2011, 05:08
 
Fecha de Ingreso: octubre-2009
Ubicación: En el ordenador
Mensajes: 504
Antigüedad: 14 años, 6 meses
Puntos: 10
Punteros en C

Hola a todos, estoy empezando en C (luego me meteré en C++) y estoy practicando con unos ejercicios que he encontrado por ahí. Ahora mismo tengo problemas con punteros:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void){
  5.     char entrada[100];
  6.     char *ult=entrada;
  7.     char cantidadstr[10];
  8.     int i,j,k = 0;
  9.     int res;
  10.  
  11.     scanf ("%s",entrada);
  12.    
  13.     printf ("Hola %s",ult);
  14.     while (*ult != "\0"){
  15.         if(*ult == "\n"){
  16.             if(i != 0){
  17.                 printf("\n");
  18.             }
  19.             i++;
  20.             j = 0;
  21.         }
  22.         else if(i != 0){
  23.             if(*ult == " "){
  24.                 j++;
  25.                 k=0;
  26.                 res = atoi(cantidadstr);
  27.                 printf("%d ",i);
  28.                 cantidadstr[10] = '\0';            
  29.             }
  30.             else if(j != 0){
  31.                 cantidadstr[k] = *ult;
  32.             }
  33.            
  34.         }
  35.         k++;
  36.         *ult++;
  37.     }
  38.     return 0;
  39. }

El puntero ult da problemas. Al compilar me salen warnings, sobre comparar punteros con int, pero el problema gordo, es que al ejecutar e insertar la cadena, me salta "Violación de segmento".

Por lo que he visto después de toda la mañana intentando arreglarlo, el error se sitúa en el printf primero, al llamar a ult.

Gracias de antemano!
__________________
Buscando ideas para proyectos....

Esperando a tener 18 años....
  #2 (permalink)  
Antiguo 15/09/2011, 07:01
 
Fecha de Ingreso: febrero-2011
Ubicación: Paraguay
Mensajes: 59
Antigüedad: 13 años, 2 meses
Puntos: 1
Respuesta: Punteros en C

Cita:
Iniciado por markmb Ver Mensaje
Hola a todos, estoy empezando en C (luego me meteré en C++) y estoy practicando con unos ejercicios que he encontrado por ahí. Ahora mismo tengo problemas con punteros:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void){
  5.     char entrada[100];
  6.     char *ult=entrada;
  7.     char cantidadstr[10];
  8.     int i,j,k = 0;
  9.     int res;
  10.  
  11.     scanf ("%s",entrada);
  12.    
  13.     printf ("Hola %s",ult);
  14.     while (*ult != "\0"){
  15.         if(*ult == "\n"){
  16.             if(i != 0){
  17.                 printf("\n");
  18.             }
  19.             i++;
  20.             j = 0;
  21.         }
  22.         else if(i != 0){
  23.             if(*ult == " "){
  24.                 j++;
  25.                 k=0;
  26.                 res = atoi(cantidadstr);
  27.                 printf("%d ",i);
  28.                 cantidadstr[10] = '\0';            
  29.             }
  30.             else if(j != 0){
  31.                 cantidadstr[k] = *ult;
  32.             }
  33.            
  34.         }
  35.         k++;
  36.         *ult++;
  37.     }
  38.     return 0;
  39. }

El puntero ult da problemas. Al compilar me salen warnings, sobre comparar punteros con int, pero el problema gordo, es que al ejecutar e insertar la cadena, me salta "Violación de segmento".

Por lo que he visto después de toda la mañana intentando arreglarlo, el error se sitúa en el printf primero, al llamar a ult.

Gracias de antemano!
Es mejor si dices cual es el ejercicio que intentas hacer, porque para usar punteros asi como veo que intentas, que es cargar el texto por parte del usuario, tienes que hacerlo usando memoria dinamica, sino no podras!
Además en el while que hace por letra lo que tienes que preguntar es si *ult["algo aqui"] es != NULL..entiendes??
Trata de poner el ejercicio y lo vamos haciendo juntos ok??
  #3 (permalink)  
Antiguo 15/09/2011, 07:11
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Punteros en C

Los arreglos definidos asi

tipo nombre_arreglo[cantidad];

pueden usar sin problemas indices desde 0 hasta (cantidad-1)
Usar un indice con valor "cantidad" o mayor para asignar es una receta para el desastre.

En tu caso k podria tener valor mayor que 10 y tu arreglo tiene 10 posiciones y veo una asignacion a la posicion 10, que he mencionado como caso conflictivo.

En resumen: Cuida los indices de los arreglos.
  #4 (permalink)  
Antiguo 15/09/2011, 08:16
 
Fecha de Ingreso: octubre-2009
Ubicación: En el ordenador
Mensajes: 504
Antigüedad: 14 años, 6 meses
Puntos: 10
Respuesta: Punteros en C

CalgaryCorpus: Con eso intentaba vaciar el arreglo....

Gott: El ejercicio te pide que dupliques los números que te dan con esta estructura:

Código:
4
5 0 1 2 3 4
0
3 -10 0 10
1 424248
La primera línea dice cuantas lineas habrá, y el primer número de cada línea dice cuántos números habrá en esa línea. El número de líneas llega hasta 1000, el número de números en la línea llega hasta 100, y no hay números mayores que 10⁹

Ahora al volver a repasar el enunciado, he visto un par de cosas:
- El tamaño del arreglo que almacena los datos, debería ser más grande, para cubrir todas las posibilidades
- Al final, cuando ya se muestran los resultados, me he equivocado de variable, y no la he multiplicado por dos (eso no es un error fatal, me hubiese dado cuenta )

A ver si me podéis ayudar, que ya me está entrando dolor de cabeza con el problemilla este
__________________
Buscando ideas para proyectos....

Esperando a tener 18 años....
  #5 (permalink)  
Antiguo 15/09/2011, 08:26
 
Fecha de Ingreso: octubre-2009
Ubicación: En el ordenador
Mensajes: 504
Antigüedad: 14 años, 6 meses
Puntos: 10
Respuesta: Punteros en C

Después de realizar los cambios que mencionaba, llego a esto:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void){
  5.     char entrada[1001*11*101];
  6.     /*Asi tenemos el tamano maximo:
  7.     1001 por las 1000 posibles lineas, mas la primera
  8.     11 por el tamano maximo del numero (1 + 9 ceros), mas el espacio o salto de linea siguiente
  9.     101 por el numero de numeros por linea, mas el primero
  10.     */
  11.     char *ult=entrada;
  12.     char cantidadstr[10];
  13.     int i,j,k = 0;
  14.     int res;
  15.  
  16.     scanf ("%s",entrada);
  17.     printf ("\n%s",entrada);
  18.    
  19.     //poniendo ese print ahi arriba, ese me lo muestra, por tanto, el fallo esta en el puntero de debajo de esta linea
  20.     printf ("Hola %s",ult);
  21.     while (*ult != "\0"){
  22.         if(*ult == "\n"){
  23.             if(i != 0){
  24.                 printf("\n");
  25.             }
  26.             i++;
  27.             j = 0;
  28.         }
  29.         else if(i != 0){
  30.             if(*ult == " "){
  31.                 j++;
  32.                 k=0;
  33.                 res = atoi(cantidadstr);
  34.                 printf("%d ",res*2);
  35.                 //Este es el otro cambio que hablaba
  36.                 cantidadstr[10] = '\0';            
  37.             }
  38.             else if(j != 0){
  39.                 cantidadstr[k] = *ult;
  40.             }
  41.            
  42.         }
  43.         k++;
  44.         *ult++;
  45.     }
  46.     return 0;
  47. }

He marcado el lugar donde deja de funcionar. Me imagino que me hace falta entender un poco mejor los punteros, pero si no es con ejemplos y a golpes, no lo consigo...
__________________
Buscando ideas para proyectos....

Esperando a tener 18 años....
  #6 (permalink)  
Antiguo 15/09/2011, 11:25
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Punteros en C

Sugiero que cambies esta linea:
Código C++:
Ver original
  1. cantidadstr[k] = *ult;

por estas :
Código C++:
Ver original
  1. if( k >= 10 ) {
  2.       printf( "Problemas en indice k, "
  3.               "no puede ser mayor o igual que 10 para que este programa funcione bien\n" );
  4.   }
  5.   else {
  6.      cantidadstr[k] = *ult;
  7. }


Una linea previa cantidadstr[10] = '\0'; nunca estará bien, pues el arreglo cantidadstr no tiene 11 posiciones.


Ademas de modificar tu codigo para que la variable "k" nunca tome un valor mayor que (tamaño del arreglo - 1), la comparacion con caracteres se hace usando comillas simples no dobles.

por ejemplo, comparacion de igualdad con caracteres:
variable == 'a'

comparacion para diferente
variable != 'a'

la comilla doble es SIEMPRE para strings literales, nunca es para caracteres literales.
  #7 (permalink)  
Antiguo 15/09/2011, 12:56
 
Fecha de Ingreso: septiembre-2011
Mensajes: 8
Antigüedad: 12 años, 7 meses
Puntos: 3
Respuesta: Punteros en C

todo vector se cuenta desde el elemento 0, osea el ultimo elemento de tu vector es de indice 9
  #8 (permalink)  
Antiguo 15/09/2011, 13:17
 
Fecha de Ingreso: octubre-2009
Ubicación: En el ordenador
Mensajes: 504
Antigüedad: 14 años, 6 meses
Puntos: 10
Respuesta: Punteros en C

Si, tenéis razón, ese era un error, pero no era el error fatal. El error fatal, que me ha costado encontrar, es problema de comillas. Como vengo de PHP y Python, donde casi no hay diferencia entre comillas simples y dobles, pues ese es el problema.

Gracias igualmente!!
__________________
Buscando ideas para proyectos....

Esperando a tener 18 años....

Etiquetas: punteros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:05.