Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21

Discussione: [C]- Aiuto stringhe

  1. #1

    [C]- Aiuto stringhe

    Buongiorno a tutti! sono nuovo e sto imparando a programmare in C per l'università.

    Ho creato un programma per la battaglia navale creando un nuovo tipo dati nave che tra i vari campi presenta una stringa per l'inserimento del nome. Poi la flotta del giocatore l'ho dichiarata come una array di "navi".
    Assegno tramite una funzione il nome della nave, tipo "Portaerei",ecc, poi provo a visualizzarlo.
    Il programma al posto del nome mi fa vedere delle lettere strane.

    Per imparare mi sono messo a giocare con le stringhe, per scoprire poi nel programma della battaglia navale dove è l'errore.

    codice:
    #include<stdio.h>
    
    
    void manipola(char *a);
    
    
    int main()
    {
    char stringa[20]="ciao";
    
    manipola(stringa);
    
    return 0;
    }
    
    void manipola(char *a)
    {
      int i;
      printf("%s\n", a);
      a="asdfas";
      printf("%s\n", a);
      scanf("%s", a);
      printf("%s\n",a);
    }

    Nel codice sopra passo per indirizzo la stringa, poi provo ad assegnarne io il contenuto prima per assegnamento e poi tramite scanf. Però il programma non funziona. Potreste darmi una mano?
    Grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non puoi scrivere

    a="asdfas";

    per modificare la stringa nella funzione manipola.
    A parte l'eccezione dell'inizializzazione in

    char stringa[20]="ciao";

    devi usare la funzione

    strcpy

    per modificare la stringa. Ovvero devi scrivere

    strcpy(a,"asdfas");

    Per la strcpy, dovrai anche aggiungere all'inizio

    #include <string.h>
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Grazie mille !! Così funziona

    Ma l'unico modo per assegnare il contenuto di una stringa è quindi usare la strcpy?

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    In linguaggio C devi sempre usare una funzione per operare con le "stringhe",
    per assegnare si usa strcpy ,ma esistono molte altre funzioni stringa per modificare e operare sulle stringhe , non puoi neanche fare un confronto tra stringhe senza una funzione,
    non puoi fare ,ad esempio , stringa a == stringa b ma usare la strcmp ,
    in compenso , puoi crearti tu delle funzioni particolari per le stringhe

    Una cosa che mi sono sempre chiesto , è perchè , i creatori del linguaggio , hanno ritenuto
    inutile , il tipo stringa , già utilizzato in linguaggi precedenti ??
    avrebbero semplificato le cose
    Tecnologia

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Non prendere come oro colato quello che ti hanno detto, non è vero che devi sempre usare una funzione per manipolare le stringhe, devi solo considerare che sono dei puntatori ad aree di memoria e che il C non è provvisto di garbage collector.
    Ciò significa che le funzioni ti facilitano la vita, ma volendo potresti fare tutto a mano gestendo la memoria e stando attento a come sposti i caratteri in memoria...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Originariamente inviato da alebertini91
    Grazie mille !! Così funziona

    Ma l'unico modo per assegnare il contenuto di una stringa è quindi usare la strcpy?
    Il motivo per cui non funzionava è che in C il passaggio di parametri avviene per valore.
    Quindi l' argomento passato viene copiato.
    a=<operando> non ha effetto perché a non è la variabile originale che è stata passata alla funzione.
    Il motivo per cui conviene usare la strcpy è che se usi l' assegnamento esplicito, la stringa può poi essere acceduta solo in lettura e non scrittura.Se vuoi usare l' operatore = per assegnare il valore di una stringa ti conviene dichiararla const char* (così quando ci accedi in scrittura il compilatore te lo segnala).
    In teoria avresti potuto farla anche così:

    codice:
    void manipola(const char** a)
    {
      *a="asdfas";
    }
    (E ovviamente ciò influisce sul modo in cui chiamerai la funzione nelle varie parti del codice).

    Ci sono poi altri mille modi per assegnare il valore di una stringa ( o meglio di un puntatore a char), ma in termini pratici ti conviene usare la strcpy.

  7. #7
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Originariamente inviato da Scara95
    Non prendere come oro colato quello che ti hanno detto, non è vero che devi sempre usare una funzione per manipolare le stringhe, devi solo considerare che sono dei puntatori ad aree di memoria e che il C non è provvisto di garbage collector.
    Ciò significa che le funzioni ti facilitano la vita, ma volendo potresti fare tutto a mano gestendo la memoria e stando attento a come sposti i caratteri in memoria...
    Sono d' accordo, e aggiungo che può servire il confronto tra due puntatori per vedere se puntano alla stessa area di memoria.
    Gli string literals vengono messi nella stessa area di memoria:

    codice:
    int main(int argc, char** argv)
    {
        const char* ptr1="ciao";
        const char* ptr2="ciao";
        char *p1, *p2;
        if(ptr1==ptr2)
            printf("ok");   // stampa ok
        p1=(char*)malloc(100*sizeof(char));
        p2=(char*)malloc(100*sizeof(char));
        strcpy(p1,"ciao");
        strcpy(p2,"ciao");
        if(p1==p2)
            printf("ok");  // non stampa ok
        free(p1);
        p1=p2;
        if(p1==p2)
            printf("ok"); // stampa ok 
        return 0;
    }

  8. #8
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    scara95
    Ciò significa che le funzioni ti facilitano la vita, ma volendo potresti fare tutto a mano gestendo la memoria e stando attento a come sposti i caratteri in memoria...

    cosa intendi ???? fai un esempio di assegnazione di pochi caratteri ,un confronto tra due array char ,senza usare funzioni , cosi non diamo per oro colato quello che dici tu
    Tecnologia

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Who am I
    In teoria avresti potuto farla anche così:

    codice:
    void manipola(const char** a)
    {
      *a="asdfas";
    }
    No ... non penso proprio ... cosa dici?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Scara95
    Non prendere come oro colato quello che ti hanno detto
    Attenzione a queste frasi ... a meno che non precisi a cosa ti riferisci, potrebbero valere anche per te ...

    non è vero che devi sempre usare una funzione
    Non è vero che devi sempre usare le funzioni, ma è meglio farlo ...

    per manipolare le stringhe, devi solo considerare che sono dei puntatori ad aree di memoria e che il C non è provvisto di garbage collector.
    Non solo questo ...

    Ciò significa che le funzioni ti facilitano la vita, ma volendo potresti fare tutto a mano gestendo la memoria e stando attento a come sposti i caratteri in memoria...
    Ecco perché usare le funzioni ... più che altro i "cicli" che gestiscono l'assegnazione dei singoli caratteri.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.