使用指针时遇到一些问题。在这个程序中,我想输入一个带有ElaboraTesto
的文本,然后输入Sdoppia
来将标记放入两个不同的数组中:
StructTesto Pari[]
如果他们的长度是均匀的。 StructTesto Dispari[]
如果他们的长度是奇数。 看起来很有效。
我使用ordinaPari
后必须根据长度排序令牌,但是当我尝试打印包含奇数令牌的数组时,stampaStruttura
没有输出,我输入奇数话。
我尝试调试程序(参见下面的代码),我发现vara
和varb
始终为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;
}
答案 0 :(得分:2)
在Sdoppia
函数中,您有以下四行:
int j=0;
int k=0;
ld = &j;
lp = &k;
这个问题是你传入的main
函数中的变量指针将被指向局部变量j
和k
的指针覆盖。
所以当你以后做
时*ld = j;
*lp =k;
您实际上是将j
分配给自己,k
分配给自己(即您只是在做j = j
和k = k
)。
解决方案是不对ld
和lp
进行初始重新分配。