Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    156

    [C] errore con aritmetica dei puntatori

    mi spiegate dove sbaglio con il ragionamento? posto questo codice creato al momento per semplificare la lettura.

    sta di fatto che non riesco a far scorrere il puntatore per legggere le singole lettere della stringa... credo che l'errore sia talmente stupido che non riesco nemmeno a vederlo...

    codice:
    #include <stdio.h>
    #define SIZE 10
    
    void myFunc (char **sPtr, char *word);
    
    int main(){
       
       char string[SIZE], word[SIZE];
       char *sPtr;
       
       fgets (string, SIZE, stdin);
       
       sPtr = string;
       
       myFunc(&sPtr, word);
       
       printf("\n%s\n", word);
       
       return 0;
    
    }
    
    void myFunc (char **sPtr, char *word){
       
       int cont = 0;
       
       printf("\nstringa puntata da sPtr: %s\n", *sPtr);
       printf("*sPtr[%d] punta alla lettera %c\n",cont, *sPtr[cont]);
       
       while (cont < SIZE){
          
          word[cont] = *sPtr[cont++];
          printf("\nword[%d]: %c\n", cont - 1, word[cont - 1]);
          
          /*INCREMENTANDO cont QUESTA ISTRUZIONE PORTA AD UN BUS ERROR*/
          printf("\nora *sPtr[%d] punta alla lettera %c\n",cont, *sPtr[cont]);
          
       }
       
       return;
    }
    il doppio puntatore nella funzione è necessario al mio programma (anche se qui in realtà non lo è...)

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [C] errore con aritmetica dei puntatori

    Originariamente inviato da ilmo lesto
    codice:
       printf("*sPtr[%d] punta alla lettera %c\n",cont, *sPtr[cont]);
    C'è solo un piccolo dettaglio che non hai considerato: l'operatore [] (accesso ad un array) ha una priorità maggiore rispetto all'operatore * (dereferenziazione). Pertanto il modo corretto è:

    (*sPtr)[cont]
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    156
    grazie mille andbin!!

    ma mi spieghi allora perchè nella funzione myFunc, la prima printf, dove cerco di visualizzare il carattere puntato da sPtr, viene interpretata correttamente, mentre quando incremento cont non viene più letta correttamente? non dovrebbe darmi errore anche nella prima printf?

    la printf di cui parlo ovviamente è

    codice:
    printf("*sPtr[%d] punta alla lettera %c\n",cont, *sPtr[cont]);

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ilmo lesto
    ma mi spieghi allora perchè nella funzione myFunc, la prima printf, dove cerco di visualizzare il carattere puntato da sPtr, viene interpretata correttamente, mentre quando incremento cont non viene più letta correttamente? non dovrebbe darmi errore anche nella prima printf?
    Su array e puntatori esiste una regola "aurea": una espressione a[i] viene convertita (dal compilatore) nella equivalente *(a+i)

    Pertanto la tua espressione

    *sPtr[cont]

    viene convertita in:

    *( *(sPtr+cont) )

    Se cont = 0 (come all'inizio nella printf), l'espressione diventa:

    **sPtr, che, come caso particolare, è corretta e permette di accedere al primo carattere della stringa.

    Ma come ho detto *sPtr[cont] non è quello che ti serve, perché tratterebbe sPtr come un array di puntatori, andando a prendere il puntatore all'indice 'cont' per poi dereferenziarlo.
    Però tu non passi alla funzione un puntatore a un array di puntatori a char, bensì passi un puntatore a un singolo puntatore a char.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    156
    grazie ancora,
    sei stato chiarissimo ed ora ho capito perfettemante!


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.