使用指针时出现一些问题。在此程序中,我想输入ElaboraTesto文本,然后输入Sdoppia将标记放入两个不同的数组中:


StructTesto Pari[]如果它们的长度是偶数。
StructTesto Dispari[]如果它们的长度是奇数。


看起来不错。

使用ordinaPari后,必须根据标记的长度对标记进行排序,但是当我尝试使用stampaStruttura打印包含奇数标记的数组时,也没有输出,我也输入了奇数词。

我尝试调试程序(请参见下面的代码),发现varavarb始终为0。

我想念什么?

#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;
}

最佳答案

Sdoppia函数中,您具有以下四行:

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


这样做的问题是,传入的main函数中的变量的指针将被局部变量jk的指针覆盖。

所以当你以后做

*ld = j;
*lp =k;


您实际上是将j分配给自己,并将k分配给自己(即,您只是在做j = jk = k)。

解决方案是不对ldlp进行初始重新分配。

关于c - 为什么“main”中的值不使用指针更改?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37655015/

10-11 22:05
查看更多