Perché al puntatore del personaggio viene assegnato un solo carattere, mentre una stringa dovrebbe essere assegnata ad esso?

Una stringa contiene tre parti separate dallo spazio. Le prime due parti sono stringhe e la terza parte è un numero intero.

L’output del programma seguente mi sorprende.

#include  #include  #include  void split(char *ch,char **part1,char **part2,int *num){ int length=strlen(ch), *lc1,*lc2; int i=0,j=0; printf("value of length is %d\n",length); printf("this function recieved %s for splitting into pieces\n",ch); lc1=(char *)malloc(length*sizeof(char)); lc2=(char *)malloc(length*sizeof(char)); while(ch[i]!=' '){ lc1[i]=ch[i]; printf("\nin loop with lc1[i] = %c and ch[i] = %c",lc1[i],ch[i]); i++; } lc1[i]='\0'; i++; while(ch[i]!=' '){ lc2[j]=ch[i]; printf("\nin loop with lc2[j] = %c and ch[i] = %c",lc2[j],ch[i]); j++; i++; } lc2[j]='\0'; i++; *num=atoi(&ch[i]); *part1=lc1; *part2=lc2; printf("\nsplit results are:\n"); printf("part1=%s and part2=%s and num=%d and lc1=%s lc2=%s //this is surprising me",*part1,*part2,*num,lc1,lc2); } int main() { int N,i,j,n,*numArray,count=0; char **arr,*part1,*part2,*token; scanf("%d",&N); arr=malloc(N*sizeof **arr); numArray=malloc(N*sizeof *numArray); for(i=0;i<N;i++){ arr[i]=(char *)malloc(50*sizeof(char)); } for(i=0;i<N;i++){ printf("plz enter %d th :",i); scanf(" "); gets(&arr[i][0]); } for(i=0;i<N;i++){ printf("%s",arr[i]); } for(i=0;i<N;i++){ /*token=strtok(arr[i]," "); part1=token; token=strtok(NULL," "); part2=token; token=strtok(NULL," "); n=atoi(token);*/ split(arr[i],&part1,&part2,&n); //some logic to use part1 and part2 of the sentence } return 0; } 

L’input I fornito è il seguente:

 1 abcd efgh 2 

La prima riga dell’ingresso contiene il numero di frasi che voglio procedere. L’output che ho ricevuto è il seguente:

 plz enter 0 th :abcd efgh 2value of length is 11 this function recieved abcd efgh 2 for splitting into pieces in loop with lc1[i] = a and ch[i] = a in loop with lc1[i] = b and ch[i] = b in loop with lc1[i] = c and ch[i] = c in loop with lc1[i] = d and ch[i] = d in loop with lc2[j] = e and ch[i] = e in loop with lc2[j] = f and ch[i] = f in loop with lc2[j] = g and ch[i] = g in loop with lc2[j] = h and ch[i] = h split results are: part1=a and part2=e and num=2 and lc1=a lc2=e //this is surprising me Success time: 0 memory: 2296 signal:0 plz enter 0 th :abcd efgh 2value of length is 11 this function recieved abcd efgh 2 for splitting into pieces in loop with lc1[i] = a and ch[i] = a in loop with lc1[i] = b and ch[i] = b in loop with lc1[i] = c and ch[i] = c in loop with lc1[i] = d and ch[i] = d in loop with lc2[j] = e and ch[i] = e in loop with lc2[j] = f and ch[i] = f in loop with lc2[j] = g and ch[i] = g in loop with lc2[j] = h and ch[i] = h split results are: part1=a and part2=e and num=2 and lc1=a lc2=e //this is surprising me 

Sebbene la funzione loop all’interno di split () venga eseguita correttamente per tutti i caratteri nella stringa, tuttavia sto ottenendo solo un carattere in part1 (anche in lc1) e part2 (anche in lc2). Qual è la ragione di questa uscita?

Questa riga è sbagliata:

 arr=malloc(N*sizeof **arr); 

dovrebbe essere:

 arr=malloc(N*sizeof *arr); 

**arr è un char , quindi assegna solo spazio per N byte, ma è necessario spazio per i puntatori N , che sono 4 byte. Quindi non stai allocando abbastanza spazio, e quindi stai scrivendo fuori dai limiti della matrice, risultando in un comportamento indefinito.

DEMO