2016-06-06 9 views
-2

Ich habe ein paar Probleme, wenn ich Zeiger verwende. In diesem Programm möchte ich zur Eingabe eines Textes mit ElaboraTesto und nach mit Sdoppia Token setzen in zwei verschiedenen Arrays:Warum werden Werte in 'main' nicht mit Zeigern geändert?

  • StructTesto Pari[], wenn ihre Länge gerade ist.
  • StructTesto Dispari[] wenn ihre Länge ungerade ist.

Aussehen wie es funktioniert.

Nachdem ich ordinaPari verwenden, die Tokens entsprechend ihrer Länge sortieren müssen, aber wenn ich versuche, das Array zu drucken, das ungerade Token enthält, mit stampaStruttura, gibt es keine Ausgabe außerdem gebe ich ungerade Wörter ein.

Ich versuche zu Debug-Programm (siehe Code unten) und ich sah, dass vara und varb sind immer 0.

Was bin ich?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define DIMMAX 100 

typedef char Stringa[DIMMAX]; 
typedef Stringa TESTO[DIMMAX]; 
typedef struct{ 

    Stringa parola; 
    int lunghezza; 

} StructTesto; 

int ElaboraTesto(TESTO, int); 
void Sdoppia(TESTO, int, StructTesto[], int* , StructTesto[], int*); 
void stampaStruttura(StructTesto[], int); 
void ordinaPari(StructTesto[], int); 

void Sdoppia(TESTO t, int l, StructTesto Pari[], int* lp, StructTesto  Dispari[DIMMAX], int* ld){ 

int i; 
StructTesto p; 
int rest; 
int j=0; 
int k=0; 
ld = &j; 
lp = &k; 

for(i=0; i<l; i++){ 

     strcpy(p.parola, t[i]); 
     p.lunghezza = strlen(p.parola); 
     rest = p.lunghezza % 2; 

     if (rest != 0){ 

       strcpy(Dispari[j].parola ,p.parola); 
       Dispari[j].lunghezza = p.lunghezza; 
       j++; 

     } else { 

       strcpy(Pari[k].parola , p.parola); 
       Pari[k].lunghezza = p.lunghezza; 
       k++; 

     } 

} 

    *ld = j;  
    *lp =k; 

} 

void stampaStruttura(StructTesto array[], int n){ 

int i; 

for(i=0; i<n; i++){ 

    printf("Parola: %s\n", array[i].parola); 
    printf("Lunghezza: %d\n", array[i].lunghezza); 
} 
} 

int ElaboraTesto(TESTO t, int n){ 

    char *tokenPtr; 
    Stringa testo; 
    int i; 

    printf("Inserire il testo da elaborare: (MAX %d parole)\n", DIMMAX); 
    gets(testo); 
    printf("Il testo che verra' tokenizzato e' il seguente:\n%s\n", testo); 
    printf("I token sono:\n"); 

    tokenPtr = strtok(testo, " "); 

    while(tokenPtr != NULL){ 

     printf("%s\n", tokenPtr); 
     strcpy(t[i], tokenPtr); 
     tokenPtr = strtok(NULL, " "); 
     i++; 

    } 
    printf("Il testo e' composto da %d parole.\n", i); 
    return i; 

} 

void ordinaPari(StructTesto P[], int n){ 

int i; 
StructTesto temp; 

    for(i=0; i<n; i++){ 

     if(P[i].lunghezza < P[i+1].lunghezza){ 
       temp = P[i]; 
       P[i] = P[i+1]; 
       P[i+1] = temp; 
     } 
    } 
    } 

int main(int argc, char *argv[]) { 

    TESTO testo; 
    int n; 
    int dim; 
    int vara = 0; 
    int varb = 0; 
    StructTesto p[DIMMAX]; 
    StructTesto d[DIMMAX]; 

    n = ElaboraTesto(testo, DIMMAX); 
    Sdoppia(testo, n, p,&vara,d,&varb); 
    stampaStruttura(p, n); 
    ordinaPari(p,vara); 
    stampaStruttura(p, vara); 

    } 



    return 0; 
} 

Antwort

2

In der Sdoppia Funktion haben Sie diese vier Linien:

int j=0; 
int k=0; 
ld = &j; 
lp = &k; 

Das Problem dabei ist, dass die Zeiger auf die Variablen in der main Funktion werden Sie passieren in den Zeiger auf die überschrieben werden lokale Variablen j und k.

Also, wenn Sie später tun

*ld = j;  
*lp =k; 

Sie tatsächlich j sich und k an sich selbst zuweisen (das heißt Sie einfach j = j und k = k tun).

Die Lösung besteht darin, die anfänglichen Neuzuweisungen zu ld und lp nicht zu tun.

Verwandte Themen