Problema lettura stringhe

di il
12 risposte

Problema lettura stringhe

Premetto che uso CodeBlocks come compilatore...e che ho una conoscenza discreta del C
le stringhe nel C sono vettori di caratteri,oppure puntatori di tipo char,essendo questi ultimi interscambiabili con i vettori....su questo non ci sono dubbi
tuttavia,perchè il compilatore mi dà errore quando tento di leggere con la scanf un puntatore?
vi spiego meglio,se faccio:
scanf("%s",s1); dove char s1[20], il tutto va a buon fine,mentre con

scanf("%s",sptr); dove char *sptr; non prende correttamente l'input?

al contrario ,se sono io a dover assegnare la stringa,con i puntatori posso farlo,se tento di assegnare una stringa a un vettore,ad esempio
s1 = "stringa"; dà errore

grazie in anticipo!

12 Risposte

  • Re: Problema lettura stringhe

    Hai iniziato col piede sbagliato, c::b è un IDE e non un compilatore, se sei sotto windows molto probabilmente starai usando il compilatore tdm-mingw che è un porting del gcc.

    i vettori sono vettori e i puntatori sono puntatori e NON sono interscambiabili come spazio di allocazione.
    Dichiarando un vettore char di 20 elementi probabilmente allocherai nello stack 20byte, dichiarando un puntatore invece nello stack allocherai solo 4byte(se sei a 32bit) che serviranno a puntare ad una allocazione della memoria qualsiasi.

    Per contenere una stringa di 20 byte allora devi allocarla in qualche modo, ad esempio creandoti dello spazio nella heap tramite la malloc() che ritornerà un indirizzo alla memoria richiesta e a questo punto e solo in questo caso il tuo puntatore potrà essere paragonato ad un vettore.
  • Re: Problema lettura stringhe

    Si va bene,sono stato un pò frettoloso nello scrivere...uso Codeblocks come IDE su Ubuntu,quinid il compilatore è il buon vecchio gcc
    in sostanza la risposta alla mia domanda qual'è?
    perchè alcune cose sono davvero strane...il vettore se lo inizializzo contestualmente alla dichiarazione tutto ok,se lo faccio nelle righe di codice successivo dà errore
  • Re: Problema lettura stringhe

    Ti stai sicuramente confondendo, sicuramente è questa la causa
    
    char *ABC= "helloworld";
    
    tu in quel codice non dici che ABC è un vettore che contiene la stringa!
    quel frammento significa che tu crei un puntatore ABC che punta in un area della memoria che contiene la stringa, scrivendo quel codice il compilatore riserva un'area della memoria costante che conterrà quella stringa, tu potrai solo prendere il suo puntatore.
    Ben diverso da scrivere
    
    char ABC []=" ciao mondo";
    
    in questo caso ABC è un vettore che contiene la stringa e potrai modificarla a piacere.
  • Re: Problema lettura stringhe

    Piranha ha scritto:


    alcune cose sono davvero strane...
    No, non sono strane, semmai non le conosci ...

    Stai confondendo il concetto di puntatore a caratteri con quello di vettore di caratteri.
  • Re: Problema lettura stringhe

    Ragazzi mi è chiarissima la differenza, ammetto che mi sono però espresso male
    vi spiego meglio quello che non capisco
    ho scritto al volo questo programmino per farvi capire
    
    #include <stdio.h>
    
    main()
    {
       char *ptr;
       char s2[100] = "1234567",s1[100];
    
      ptr = "Stringa di prova";
      printf("%s",ptr);
      s1 = "Altra stringa";  //errore
    
       return 0;
    }
    
    inizializzo il puntatore di caratteri e lo faccio stampare,e qui tutto ok.
    i vettori di caratteri invece,se li inizializzo contestualmente alla dichiarazione tutto ok,se lo faccio invece nel programma mi dice "incompatible types when assigning to type "char []" from "char *"
  • Re: Problema lettura stringhe

    Ti confermo quello che ti ho detto ... il problema è che non conosci bene la differenza tra puntatore e array ...

    char *ptr

    è un puntatore e

    "Stringa di prova"

    è un puntatore. Quindi va bene. Ma

    s1[100]

    è un vettore di caratteri (un'area di memoria) e se devi assegnare ad un'area di memoria dei dati lo devi fare copiando i caratteri uno alla volta.

    E' la differenza tra

    char[] e char *

    che non ti è ancora chiara.

    Diciamo che nel primo caso non c'è spostamento di dati (della stringa) ma solamente dell'indirizzo iniziale; nel secondo caso devi spostare i caratteri da una zona all'altra per l'assegnazione.
  • Re: Problema lettura stringhe

    Hahah ragazzi continuiamo a non capirci
    lo so che per come mi sono espresso male può sembrare che non mi sia chiara la differenza teorica
    ma come ho detto il problema è che non ci siamo capiti
    Quello che non mi è chiaro, è perchè, se inizializzo lo stramaledetto vettore nella dichiarazione è tutto ok, se lo faccio nel codice è un errore
  • Re: Problema lettura stringhe

    Piranha ha scritto:


    Quello che non mi è chiaro, è perchè, se inizializzo lo stramaledetto vettore nella dichiarazione è tutto ok, se lo faccio nel codice è un errore
    Nella prima riga inizializzi l'array, nella seconda assegni un valore all'array.

    La differenza tra inizializzazione e assegnazione è importante perché durante l'inizializzazione il dato viene copiato tramite codice opportunamente inserito dal compilatore, ma l'assegnazione di un array è vietata.
  • Re: Problema lettura stringhe

    Detto in soldoni, devi copiare un carattere alla volta nell'array.
  • Re: Problema lettura stringhe

    Va bene,abbiamo trovato il passaggio che mi mancava
    cioè la differenza tra quello che succede nell'inizializzazione e nell'assegnazione....
    grazie mille
  • Re: Problema lettura stringhe

    Il fatto è che all'inizio del thread questa tua affermazione

    le stringhe nel C sono vettori di caratteri,oppure puntatori di tipo char,essendo questi ultimi interscambiabili con i vettori

    non proprio corretta, ci aveva portato su un'altra strada.
  • Re: Problema lettura stringhe

    Sisi ho già ammesso che lo sbaglio è stato mio nell'esprimermi, avendo scritto di fretta
Devi accedere o registrarti per scrivere nel forum
12 risposte