Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [C] Puntatori ed assegnazione non possibile

    Salve ragazzi, ho uno strano problema con l'assegnazione tra due puntatori.Mi viene segnalato un errore di incompatible types in assignment, quando
    faccio puntare temp, dove punta s, eppure temp ed s sono tutti e due
    puntatori a char. Come posso risolvere questo problema?
    Posto qui sotto il codice:

    codice:
    #include <stdio.h>
    
    int main()
    {       char *s[12];
            
            char *temp[12];
    
            printf("Inserimento stringa S \n");
            scanf("%s", &s);
    
            temp=s;
    
            printf("%s" ,*temp);
    
    
    return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    s e temp, per come le hai dichiarate, sono due vettori di stringhe, per cui non mi stupirei se la scanf non funzionasse correttamente.
    Per risolvere il problema, per prima cosa puoi far ricorso alle librerie di manipolazione delle stringhe, aggiungendo un include

    codice:
    #include <string.h>
    quindi cambi la dichiarazione dei puntatori

    codice:
    char s[12],
         temp[12];
    infine usi la funzione di copia delle stringhe

    codice:
    strcpy (temp,s);
    Saluti

  3. #3
    Certo così potrebbe essere una soluzione, ma non capisco una cosa, una stringa è un vettore di caratteri, così come un vettore è implicitamente un puntatore, allora perchè l'assegnazione temp=s non funziona?

  4. #4
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    In C non è permesso copiare direttamente le stringhe

    prova questo codice invece

    codice:
    
     main (){
         
         char ** b,
              ** c;
              
         b=c;
         
     }
    vedrai che funziona

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da GiulioCesare
    Certo così potrebbe essere una soluzione, ma non capisco una cosa, una stringa è un vettore di caratteri, così come un vettore è implicitamente un puntatore, allora perchè l'assegnazione temp=s non funziona?
    Forse l'equivoco iniziale sta nel fatto che tu intendi con questa scrittura

    char *s[12];

    dichiarare una stringa in C.

    In realta' stai dichiarando un vettore di puntatori a stringhe, un vettore di puntatori a 12 stringhe diverse (ma non allocate).
    Una stringa di 12 caratteri (in realta' 11+terminatore) e'

    char s[12]

  6. #6
    Forse si ho fatto un pò di confusione, ma una stringa, non è altro che un vettore di caratteri, ed un vettore è implicitamente un puntatore, quindi non posso usare una stringa, come fosse un puntatore?

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Certo che puoi farlo ... se scrivi

    char s[12];

    e (in seguito) nel sorgente scrivi

    printf("%s", s);

    stai usando s come puntatore (alla stringa).
    Quello che intendi tu ...

  8. #8
    Si puoi trattare il vettore come un puntatore,
    ma scrivendo cosi
    codice:
    char * s[12];
    crei un vettore di 12 puntatori a char.
    Per creare un puntatore ad una stringa ti è sufficente fare cosi:
    codice:
    char *s;
    per farti capire se non erro in qualcosa il codice doveva essere cosi:
    codice:
    #include <stdio.h>
    
    int main()
    {       char s[12];
            
            char *temp;
    
            printf("Inserimento stringa S \n");
            scanf("%s", s);
    
            temp=s;
    
            printf("%s" ,temp);
    
    
    return 0;
    }

  9. #9
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Qualche altro chiarimento:

    - una stinga per convenzione è un vettore di caratteri terminato dal carttere nullo, altrimenti non è una stringa e può essere dichiarata come un char[n] o come un char * da allocare.

    - un array è un puntatore COSTANTE e quindi non può essere riassegnato. Possono essere modificati i singoli elementi contenuti nell'array, ma non l'indirizzo di memoria a cui punta l'array, che corrisponde all'indirizzo della sua prima locazione. Quindi:

    char a[12];
    char *p;
    //la seguente è un'istruzione illegittima
    //perchè un array non puo essere riassegnato
    a = p;
    //la seguente istruzione è invece possibile:
    p = a;

    e quindi p può essere usato per accedere agli elemnti dell'array come a: p[0], p[1], ecc ecc

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  10. #10
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    Originariamente inviato da anx721
    - un array è un puntatore COSTANTE e quindi non può essere riassegnato.

    Questo significa che in linea generale se lavoro su un array di interi direttamente tramite puntatore dovrei dichiararlo non tanto come const int * p ma come int * const p

    Creare una sorta di reference del C++ in C
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

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.