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

Puñeteros Punteros y Strings en C

Estas en el tema de Puñeteros Punteros y Strings en C en el foro de C/C++ en Foros del Web. Hola, estoy teniendo quebraderos de cabeza con los punteros y las cadenas en C, a ver si algún alma caritativa me ayuda a aclararme : ...
  #1 (permalink)  
Antiguo 02/11/2010, 14:20
 
Fecha de Ingreso: mayo-2007
Mensajes: 200
Antigüedad: 17 años
Puntos: 1
Exclamación Puñeteros Punteros y Strings en C

Hola, estoy teniendo quebraderos de cabeza con los punteros y las cadenas en C, a ver si algún alma caritativa me ayuda a aclararme :

Código:
void procesarCadena(char Nombre[], int* FechaI, int* FechaF, int Estados[], char cadena[]){

int aux[30];
int i=0;
int j=0;
int h=0;
while(cadena[i]!='\0'){
    switch(cadena[i]){
      case ';': Estados[j]=atoi(aux); j++; break;
      case '[': break;
      case ']': if(Nombre==null){
                    strcpy(Nombre, aux); 
                    aux[0]='\0';
                } 
                else if(FechaI == null){ 
                     FechaI=atoi(aux); 
                     aux[0]='\0';
                } else {
                       FechaF=atoi(aux);
                       aux[0]='\0';
                } 
                break;
      case '{': break;
      case '}': Estados[j]=atoi(aux); j++; aux[0]='\0'; break;
      default: aux[h]=cadena[i]; h++; break;
    }
}

int main(int argc, char *argv[])
{
    char* arrayL[12];
   
    char TipoProceso[80];
    int FechaI;
    int FechaF;
    int Estados[100];
    procesarCadena(TipoProceso, &FechaI, &FechaF, Estados, arrayL[0]);
    return 0;
}
Lo que estoy tratando de hacer es pasarle todas las variables del programa principal a la función procesarCadena por referencia para que los cambios queden registrados en las variables.

La función va recorriendo una cadena que se encuentra en un array de cadenas que yo le paso y va estrayendo los datos de ella y guardándolos en las variables correspondientes.

Preguntas:
¿Están bien pasadas las variables?
Es decir, cuando yo quiero pasar un array, lo único que tengo que hacer es poner el nombre ¿no?, porque así le estoy pasando el puntero a la primera posición del array. No necesita ampersan ni movidas raras.

¿Por qué narices no me compila?

Gracias al alma caritativa que me ayude y lo siento por el mensaje tan largo.
__________________
Blog: http://a-dream-of-dragon.blogspot.com
  #2 (permalink)  
Antiguo 02/11/2010, 14:44
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Puñeteros Punteros y Strings en C

Tenes unos cuantos errores. Yo diria bastantes. Deberias acostumbrarte a leer los mensajes de error del comilador.

Para empezar te faltaban incluir las librerias string.h y stdio.h.

La funcion procesarCadena le falta la llave de cierrre.
LA funcion strcpy pide dos punteros a char y tu funcion aux esta definida como puntero a int.
FechaI y FechaF en la funcion procesarCadena son punteros, asi que si queres modificarle el valor debes poner el asterisco que hace la desreferencia del puntero y te da el acceso a la memoria en contreto.
Los null van en mayusculas. Asi NULL.

Bueno te dejo el codigo corregido.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3. void procesarCadena(char Nombre[], int* FechaI, int* FechaF, int Estados[], char cadena[])
  4. {
  5.  
  6. char aux[30];
  7. int i=0;
  8. int j=0;
  9. int h=0;
  10. while(cadena[i]!='\0'){
  11.     switch(cadena[i]){
  12.       case ';': Estados[j]=atoi(aux); j++; break;
  13.       case '[': break;
  14.       case ']': if(Nombre==NULL){
  15.                     strcpy(Nombre, aux);
  16.                     aux[0]='\0';
  17.                 }
  18.                 else if(FechaI == NULL){
  19.                      *FechaI=atoi(aux);
  20.                      aux[0]='\0';
  21.                 } else {
  22.                        *FechaF=atoi(aux);
  23.                        aux[0]='\0';
  24.                 }
  25.                 break;
  26.       case '{': break;
  27.       case '}': Estados[j]=atoi(aux); j++; aux[0]='\0'; break;
  28.       default: aux[h]=cadena[i]; h++; break;
  29.     }
  30. }
  31. }
  32. int main(int argc, char *argv[])
  33. {
  34.     char* arrayL[12];
  35.    
  36.     char TipoProceso[80];
  37.     int FechaI;
  38.     int FechaF;
  39.     int Estados[100];
  40.     procesarCadena(TipoProceso, &FechaI, &FechaF, Estados, arrayL[0]);
  41.     return 0;
  42. }

No verifique que el programa ande correctamente. Solo los errores de sintaxis.
  #3 (permalink)  
Antiguo 03/11/2010, 03:19
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 11 meses
Puntos: 73
Respuesta: Puñeteros Punteros y Strings en C

En la función main has definido

char* arrayL[12];

Según esto, arrayL es un array de 12 punteros a char.

En la llamada a procesarCadena estás pasando arrayL[0], lo que concuerda con el prototipo. Correcto.

Una vez dentro de la función, lo que has pasado como arrayL[0] pasa a ser cadena[]. A continuación trabajas con los elementos individuales de cadena[]. Correcto.

Lo que se te ha pasado por alto es lo siguiente:

Los punteros de arrayL no se han inicializado a valor alguno. En la llamada a procesarCadena estás, por lo tanto, pasando un puntero que no sabes a dónde apunta. El programa (bueno, la corrección hecha por sam90) compilaría bien (no habría errores de cara al compilador), pero al ejecutarlo te encontrarás, seguro, con un comportamiento errático y, casi seguro, con un error tipo Segmentation Fault o similar.

Parece que lo que querías poner es

char arrayL[12];

y luego, claro está, meter algún valor en arrayL antes de llamar a procesarCadena.

Si lo que querías es un array de cadenas, la declaración inicial sería correcta, pero después tendrías que reservar espacio para cada una de esas cadenas e inicializarlas a algún valor. O bien, declarar un array de dos dimensiones:

char arrayL[12][30]

y tendrías 12 arrays de 30 caracteres.

Por demás, las variables están bien pasadas. El nombre de un array es un puntero a su primer elemento.

Por cierto, que al pasar parámetros te da lo mismo poner

<tipo> *nombre;

que poner

<tipo> nombre[].

Por cierto, al pasar un array como parámetro, la función que lo recibe no tendrá información sobre el tamaño del array.

Etiquetas: arrays, cadenas, punteros, strings, vectores
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 17:10.