Oppure

Loading
21/01/16 0:19
Salve a tutti, espongo il mio quesito.
Mi sto cimentando per hobby col c e nel frattempo vorrei imparare a programmare seriamente.

Vorrei creare il gioco dell'impiccato (data una frase xxx_xx_xx , la si deve indovinare).
Ho diversi dilemmi su alcuni punti. (Premesso che il programma, tranne qualche piccolo bug per lo più testuale, funziona, quindi la funzione "non dovrebbe" contenere errori, ma forse ne ho fatti in numero pari e si compensano XD.

Ecco una funzione del codice:
( una delle funzioni chiavi. Dato un puntatore ad una stringa,
ne torna un'altro che punta alla stringa contenente la frase celata.
La Stringa è controllata prima del passaggio, ha tutti i caratteri in minuscolo,
l'EOF finale e non continene lettere accentate ).
Perchè usare una funzione a parte e utilizzare i puntatori?
Per rende la funzione adoperabile anche in altri progetti (se la creassi dentro al main non potrei)
e perchè non so l'esatta lunghezza della stringa (viene pescata da un file con diverse frasi).


/****************************************************************************************
 *  char* nascondiStr( char *stringa , size_t dim )                                     *
 *                                                                                      *
 *              Funzione che crea un puntatore alla stringa nascosta                    *
 *                   del tipo (***_***) da una stringa normale                          *
 *          Input                                                                       *
 *              - (char)   *stringa    : stringa da nascondere                          *
 *              - (size_t)  dim         : dimensione della stringa da nascondere           *
 *          Output                                                                      *
 *              - (*char)  puntatore di char alla stringa (***_***)                     *
 *                                                                                      *
 ***************************************************************************************/

/* librerie standard*/
#include <stdlib.h>
#include <string.h>

char* nascondiStr( char *stringa , size_t dim )
{
    /* DEFINIZIONI E INIZIALIZZAZIONI VARIABILI */
    char  *stringaNascosta = NULL ; /* Stringa di appoggio */
    size_t i = 0 ;                  /* contatore per il for */
    /* DEFINIZIONI E INIZIALIZZAZIONI VARIABILI */

    /* alloco dim*char per la stringa da nascondere */
    stringaNascosta = (char *)calloc( dim, sizeof( char ) );

    /* copia la stringa da nascondere su quella che verrà passata */
    strcpy( stringaNascosta , stringa );

    /* ciclo per esaminare tutti i caratteri fino a EOF */
    for( int i = 0; stringaNascosta[i] != 'Salve a tutti, espongo il mio quesito.

Mi sto cimentando per hobby col c e nel frattempo vorrei imparare a programmare seriamente.

Vorrei creare il gioco dell'impiccato (data una frase xxx_xx_xx , la si deve indovinare).
Ho diversi dilemmi su alcuni punti. (Premesso che il programma, tranne qualche piccolo bug per lo più testuale, funziona, quindi la funzione "non dovrebbe" contenere errori, ma forse ne ho fatti in numero pari e si compensano XD.

Ecco una funzione del codice:
( una delle funzioni chiavi. Dato un puntatore ad una stringa,
ne torna un'altro che punta alla stringa contenente la frase celata.
La Stringa è controllata prima del passaggio, ha tutti i caratteri in minuscolo,
l'EOF finale e non continene lettere accentate ).
Perchè usare una funzione a parte e utilizzare i puntatori?
Per rende la funzione adoperabile anche in altri progetti (se la creassi dentro al main non potrei)
e perchè non so l'esatta lunghezza della stringa (viene pescata da un file con diverse frasi).


/****************************************************************************************
 *  char* nascondiStr( char *stringa , size_t dim )                                     *
 *                                                                                      *
 *              Funzione che crea un puntatore alla stringa nascosta                    *
 *                   del tipo (***_***) da una stringa normale                          *
 *          Input                                                                       *
 *              - (char)   *stringa    : stringa da nascondere                          *
 *              - (size_t)  dim         : dimensione della stringa da nascondere           *
 *          Output                                                                      *
 *              - (*char)  puntatore di char alla stringa (***_***)                     *
 *                                                                                      *
 ***************************************************************************************/

/* librerie standard*/
#include <stdlib.h>
#include <string.h>

char* nascondiStr( char *stringa , size_t dim )
{
    /* DEFINIZIONI E INIZIALIZZAZIONI VARIABILI */
    char  *stringaNascosta = NULL ; /* Stringa di appoggio */
    size_t i = 0 ;                  /* contatore per il for */
    /* DEFINIZIONI E INIZIALIZZAZIONI VARIABILI */

    /* alloco dim*char per la stringa da nascondere */
    stringaNascosta = (char *)calloc( dim, sizeof( char ) );

    /* copia la stringa da nascondere su quella che verrà passata */
    strcpy( stringaNascosta , stringa );

    /* ciclo per esaminare tutti i caratteri fino a EOF */
    for( int i = 0; stringaNascosta[i] != '{parsed_message}'; i++ ) {

        /* Se trova una lettera minuscola lo pone uguale a '*'  */
        if( stringaNascosta[i] >= 97 && stringaNascosta[i] <= 122 ) {
            stringaNascosta[i] = '*';
        }/* fine if */
    }/* fine for */

    return stringaNascosta;
} /* fine main */



1 Punto: Per essere corretto, a fine funzione non dovrei deallocare la memoria allocata?
Potrei farlo nel main, ma ciò non renderebbe la funzione difficilmente adoperabile altrove?

2 Punto: Per tenere traccia di tutte le modifiche ai file, che posso usare?
Git mi pare eccessivo per pochi file.

3 Punto: I nomi variabili, commenti e identazione vanno bene?
a fine file vorrei aggiungere pure un CHANGELOG che tiene conto delle varie versioni,
ma non vorre appesantire troppo i sorgenti.

4 Punto: Ho spezzettato quasi tutto il programma in funzioni più piccole, fatto bene o male?
troppe funzioni non rallentano troppo l'esecuzione?
gli header e i file contenenti le funzioni devono avere lo stesso nome?
io ho creato un file .c per ogni che sto usando, e solo un header che racchiude tutti i prototipi.
Potrei accomunare varie funzioni tra loro, ma per ora ho preferito fare cosi,
almeno mi stampo le funzioni una ad una e le posso "correggere" anche a pc spento.

Per concludere dico che uso Visual Studio 2015 (versione free) ma ho anche lavorato con
Dev-c++ (perche è un ide in italiano) e un pochino con code::block (ma con cui non mi trovo)
Vorrei anche imparare a compilare da linea di comando in futuro
(ma se dite che sia necessario imparare a farlo fin da ora... mi cimento pure in questo).

Grazie fin da ora a tutti coloro volessero aiutarmi.


'; i++ ) { /* Se trova una lettera minuscola lo pone uguale a '*' */ if( stringaNascosta[i] >= 97 && stringaNascosta[i] <= 122 ) { stringaNascosta[i] = '*'; }/* fine if */ }/* fine for */ return stringaNascosta; } /* fine main */


1 Punto: Per essere corretto, a fine funzione non dovrei deallocare la memoria allocata?
Potrei farlo nel main, ma ciò non renderebbe la funzione difficilmente adoperabile altrove?

2 Punto: Per tenere traccia di tutte le modifiche ai file, che posso usare?
Git mi pare eccessivo per pochi file.

3 Punto: I nomi variabili, commenti e identazione vanno bene?
a fine file vorrei aggiungere pure un CHANGELOG che tiene conto delle varie versioni,
ma non vorre appesantire troppo i sorgenti.

4 Punto: Ho spezzettato quasi tutto il programma in funzioni più piccole, fatto bene o male?
troppe funzioni non rallentano troppo l'esecuzione?
gli header e i file contenenti le funzioni devono avere lo stesso nome?
io ho creato un file .c per ogni che sto usando, e solo un header che racchiude tutti i prototipi.
Potrei accomunare varie funzioni tra loro, ma per ora ho preferito fare cosi,
almeno mi stampo le funzioni una ad una e le posso "correggere" anche a pc spento.

Per concludere dico che uso Visual Studio 2015 (versione free) ma ho anche lavorato con
Dev-c++ (perche è un ide in italiano) e un pochino con code::block (ma con cui non mi trovo)
Vorrei anche imparare a compilare da linea di comando in futuro
(ma se dite che sia necessario imparare a farlo fin da ora... mi cimento pure in questo).

Grazie fin da ora a tutti coloro volessero aiutarmi.


21/01/16 9:24
nessuno
Elimina il parametro

size_t dim

perché non serve e usa la strlen senza dimenticare il carattere terminatore, quindi

stringaNascosta = (char *)calloc( strlen(stringa)+1, sizeof( char ) );

Ovviamente non devi deallocare prima di uscire altrimenti non hai fatto nulla ... la liberazione della memoria è a carico del chiamante.

Potresti anche semplificare il codice usando la funzione _strdup

Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
21/01/16 10:15
Postato originariamente da nessuno:

Elimina il parametro

size_t dim

perché non serve e usa la strlen senza dimenticare il carattere terminatore, quindi

stringaNascosta = (char *)calloc( strlen(stringa)+1, sizeof( char ) );

Innanzitutto grazie per la risposta.
Mi sono portato dietro la dimensione di *stringa perche in vari punti del programma la utilizzo e volevo evitare diverse chiamate a strlen().


[/b]:
Ovviamente non devi deallocare prima di uscire altrimenti non hai fatto nulla ... la liberazione della memoria è a carico del chiamante.

quello che volevo evitare, altrimenti, ad esempio, se qualcun'altro la utilizzasse dovrebbe sapere che il chiamante deve deallocare la stringa. Anche io stesso, se la usassi tra un mese , potrei scordarlo XD (vabbe, io ho la documentazione in caso, ma vorrei qualcosa di più generale, se è possibile farlo)

[/b]:
Potresti anche semplificare il codice usando la funzione _strdup

Non conoscevo la funzione, grazie del suggerimento, io per ora sto cercando di usare le librerie dello standard, ho appena letto che essa non ne fa parte.


EDIT1 & 2 : Correzioni al testo.

Ultima modifica effettuata da 21/01/16 10:17
21/01/16 12:32
nessuno
Mi sono portato dietro la dimensione di *stringa perche in vari punti del programma la utilizzo e volevo evitare diverse chiamate a strlen().


Beh, non esageriamo, la chiamata a strlen non è così pesante ... così invece la tua funzione è legata alla chiamata di strlen prima per ogni stringa ...

quello che volevo evitare


E' un discorso che non ha senso. La stringa restituita deve pur essere in memoria.

Ultima modifica effettuata da nessuno 21/01/16 12:32
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
21/01/16 13:31
ok per strlen...
Ecco la nuova funzione

/* librerie standard*/
#include <stdlib.h>
#include <string.h>

char* nascondiStr( char *stringa )
{
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
    char  *stringaNascosta = NULL ; /* Stringa di appoggio */
    size_t i = 0 ;                  /* contatore per il for */
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */

    /* alloco dim*char per la stringa da nascondere */
    stringaNascosta = (char *)calloc( strlen(stringa) + 1, sizeof( char ) );
    
    /* Controllo allocazione memoria */
	if( stringaNascosta == NULL ) {
        printf("Non riesco ad allocare memoria\n");
        exit(1);
    }
	 
    /* copia la stringa da nascondere su quella che verrà passata */
    strcpy( stringaNascosta , stringa );

    /* ciclo per esaminare tutti i caratteri fino a EOF */
    for( int i = 0; stringaNascosta[i] != 'ok per strlen...

Ecco la nuova funzione

/* librerie standard*/
#include <stdlib.h>
#include <string.h>

char* nascondiStr( char *stringa )
{
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
    char  *stringaNascosta = NULL ; /* Stringa di appoggio */
    size_t i = 0 ;                  /* contatore per il for */
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */

    /* alloco dim*char per la stringa da nascondere */
    stringaNascosta = (char *)calloc( strlen(stringa) + 1, sizeof( char ) );
    
    /* Controllo allocazione memoria */
	if( stringaNascosta == NULL ) {
        printf("Non riesco ad allocare memoria\n");
        exit(1);
    }
	 
    /* copia la stringa da nascondere su quella che verrà passata */
    strcpy( stringaNascosta , stringa );

    /* ciclo per esaminare tutti i caratteri fino a EOF */
    for( int i = 0; stringaNascosta[i] != '{parsed_message}'; i++ ) {

        /* Se trova una lettera minuscola lo pone uguale a '*'  */
        if( stringaNascosta[i] >= 97 && stringaNascosta[i] <= 122 ) {
            stringaNascosta[i] = '*';
        }/* fine if */
    }/* fine for */

    return stringaNascosta;
} /* fine main */

ho aggiunto il controllo dell'allocazione che mi ero scordato

Comunque, quello che chiedevo , scusate se mi sono espresso male, è se si poteva evitare di dover allocare/deallocare il puntatore, ad esempio come in questa caso:
/* librerie standard*/
#include <stdlib.h>
#include <string.h>

void nascondiStr( char *stringa, char  *stringaNascosta )
{
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
    size_t i = 0 ;                  /* contatore per il for */
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
	 
    /* copia la stringa da nascondere su quella che verrà passata */
    strcpy( stringaNascosta , stringa );

    /* ciclo per esaminare tutti i caratteri fino a EOF */
    for( int i = 0; stringaNascosta[i] != '{parsed_message}'; i++ ) {

        /* Se trova una lettera minuscola lo pone uguale a '*'  */
        if( stringaNascosta[i] >= 97 && stringaNascosta[i] <= 122 ) {
            stringaNascosta[i] = '*';
        }/* fine if */
    }/* fine for */

} /* fine main */


/* allocando la stringa prima nel main, cioè passo le due stringhe dal main per riferimento
...
   stringaNascosta = (char *)calloc( strlen(stringa) + 1, sizeof( char ) );
   nascondiStr(  *stringa, *stringaNascosta ) ;
...

*/


o in questo

/* librerie standard*/
#include <stdlib.h>
#include <string.h>

/* qui passo solo */
void nascondiStr( char *stringaNascosta )
{
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
    size_t i = 0 ;                  /* contatore per il for */
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
    
    /* ciclo per esaminare tutti i caratteri fino a EOF */
    for( int i = 0; stringaNascosta[i] != '{parsed_message}'; i++ ) {

        /* Se trova una lettera minuscola lo pone uguale a '*'  */
        if( stringaNascosta[i] >= 97 && stringaNascosta[i] <= 122 ) {
            stringaNascosta[i] = '*';
        }/* fine if */
    }/* fine for */

} /* fine main */

/*  NEL MAIN
...
    stringaNascosta = (char *)calloc( strlen(stringa) + 1, sizeof( char ) );
	strcpy( *stringaNascosta, *stringa );
	nascondiStr( *stringaNascosta ) ;
... 
*/


EDIT:
quasi certamente un'allocazione/deallocazione sarà necessaria, ma entrambe nella stessa funzione è da preferirsi per evitare eventuali dimenticanze.

'; i++ ) { /* Se trova una lettera minuscola lo pone uguale a '*' */ if( stringaNascosta[i] >= 97 && stringaNascosta[i] <= 122 ) { stringaNascosta[i] = '*'; }/* fine if */ }/* fine for */ return stringaNascosta; } /* fine main */

ho aggiunto il controllo dell'allocazione che mi ero scordato

Comunque, quello che chiedevo , scusate se mi sono espresso male, è se si poteva evitare di dover allocare/deallocare il puntatore, ad esempio come in questa caso:
/* librerie standard*/
#include <stdlib.h>
#include <string.h>

void nascondiStr( char *stringa, char  *stringaNascosta )
{
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
    size_t i = 0 ;                  /* contatore per il for */
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
	 
    /* copia la stringa da nascondere su quella che verrà passata */
    strcpy( stringaNascosta , stringa );

    /* ciclo per esaminare tutti i caratteri fino a EOF */
    for( int i = 0; stringaNascosta[i] != 'ok per strlen...

Ecco la nuova funzione

/* librerie standard*/
#include <stdlib.h>
#include <string.h>

char* nascondiStr( char *stringa )
{
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
    char  *stringaNascosta = NULL ; /* Stringa di appoggio */
    size_t i = 0 ;                  /* contatore per il for */
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */

    /* alloco dim*char per la stringa da nascondere */
    stringaNascosta = (char *)calloc( strlen(stringa) + 1, sizeof( char ) );
    
    /* Controllo allocazione memoria */
	if( stringaNascosta == NULL ) {
        printf("Non riesco ad allocare memoria\n");
        exit(1);
    }
	 
    /* copia la stringa da nascondere su quella che verrà passata */
    strcpy( stringaNascosta , stringa );

    /* ciclo per esaminare tutti i caratteri fino a EOF */
    for( int i = 0; stringaNascosta[i] != '{parsed_message}'; i++ ) {

        /* Se trova una lettera minuscola lo pone uguale a '*'  */
        if( stringaNascosta[i] >= 97 && stringaNascosta[i] <= 122 ) {
            stringaNascosta[i] = '*';
        }/* fine if */
    }/* fine for */

    return stringaNascosta;
} /* fine main */

ho aggiunto il controllo dell'allocazione che mi ero scordato

Comunque, quello che chiedevo , scusate se mi sono espresso male, è se si poteva evitare di dover allocare/deallocare il puntatore, ad esempio come in questa caso:
/* librerie standard*/
#include <stdlib.h>
#include <string.h>

void nascondiStr( char *stringa, char  *stringaNascosta )
{
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
    size_t i = 0 ;                  /* contatore per il for */
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
	 
    /* copia la stringa da nascondere su quella che verrà passata */
    strcpy( stringaNascosta , stringa );

    /* ciclo per esaminare tutti i caratteri fino a EOF */
    for( int i = 0; stringaNascosta[i] != '{parsed_message}'; i++ ) {

        /* Se trova una lettera minuscola lo pone uguale a '*'  */
        if( stringaNascosta[i] >= 97 && stringaNascosta[i] <= 122 ) {
            stringaNascosta[i] = '*';
        }/* fine if */
    }/* fine for */

} /* fine main */


/* allocando la stringa prima nel main, cioè passo le due stringhe dal main per riferimento
...
   stringaNascosta = (char *)calloc( strlen(stringa) + 1, sizeof( char ) );
   nascondiStr(  *stringa, *stringaNascosta ) ;
...

*/


o in questo

/* librerie standard*/
#include <stdlib.h>
#include <string.h>

/* qui passo solo */
void nascondiStr( char *stringaNascosta )
{
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
    size_t i = 0 ;                  /* contatore per il for */
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
    
    /* ciclo per esaminare tutti i caratteri fino a EOF */
    for( int i = 0; stringaNascosta[i] != '{parsed_message}'; i++ ) {

        /* Se trova una lettera minuscola lo pone uguale a '*'  */
        if( stringaNascosta[i] >= 97 && stringaNascosta[i] <= 122 ) {
            stringaNascosta[i] = '*';
        }/* fine if */
    }/* fine for */

} /* fine main */

/*  NEL MAIN
...
    stringaNascosta = (char *)calloc( strlen(stringa) + 1, sizeof( char ) );
	strcpy( *stringaNascosta, *stringa );
	nascondiStr( *stringaNascosta ) ;
... 
*/


EDIT:
quasi certamente un'allocazione/deallocazione sarà necessaria, ma entrambe nella stessa funzione è da preferirsi per evitare eventuali dimenticanze.

'; i++ ) { /* Se trova una lettera minuscola lo pone uguale a '*' */ if( stringaNascosta[i] >= 97 && stringaNascosta[i] <= 122 ) { stringaNascosta[i] = '*'; }/* fine if */ }/* fine for */ } /* fine main */ /* allocando la stringa prima nel main, cioè passo le due stringhe dal main per riferimento ... stringaNascosta = (char *)calloc( strlen(stringa) + 1, sizeof( char ) ); nascondiStr( *stringa, *stringaNascosta ) ; ... */


o in questo

/* librerie standard*/
#include <stdlib.h>
#include <string.h>

/* qui passo solo */
void nascondiStr( char *stringaNascosta )
{
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
    size_t i = 0 ;                  /* contatore per il for */
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
    
    /* ciclo per esaminare tutti i caratteri fino a EOF */
    for( int i = 0; stringaNascosta[i] != 'ok per strlen...

Ecco la nuova funzione

/* librerie standard*/
#include <stdlib.h>
#include <string.h>

char* nascondiStr( char *stringa )
{
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
    char  *stringaNascosta = NULL ; /* Stringa di appoggio */
    size_t i = 0 ;                  /* contatore per il for */
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */

    /* alloco dim*char per la stringa da nascondere */
    stringaNascosta = (char *)calloc( strlen(stringa) + 1, sizeof( char ) );
    
    /* Controllo allocazione memoria */
	if( stringaNascosta == NULL ) {
        printf("Non riesco ad allocare memoria\n");
        exit(1);
    }
	 
    /* copia la stringa da nascondere su quella che verrà passata */
    strcpy( stringaNascosta , stringa );

    /* ciclo per esaminare tutti i caratteri fino a EOF */
    for( int i = 0; stringaNascosta[i] != '{parsed_message}'; i++ ) {

        /* Se trova una lettera minuscola lo pone uguale a '*'  */
        if( stringaNascosta[i] >= 97 && stringaNascosta[i] <= 122 ) {
            stringaNascosta[i] = '*';
        }/* fine if */
    }/* fine for */

    return stringaNascosta;
} /* fine main */

ho aggiunto il controllo dell'allocazione che mi ero scordato

Comunque, quello che chiedevo , scusate se mi sono espresso male, è se si poteva evitare di dover allocare/deallocare il puntatore, ad esempio come in questa caso:
/* librerie standard*/
#include <stdlib.h>
#include <string.h>

void nascondiStr( char *stringa, char  *stringaNascosta )
{
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
    size_t i = 0 ;                  /* contatore per il for */
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
	 
    /* copia la stringa da nascondere su quella che verrà passata */
    strcpy( stringaNascosta , stringa );

    /* ciclo per esaminare tutti i caratteri fino a EOF */
    for( int i = 0; stringaNascosta[i] != '{parsed_message}'; i++ ) {

        /* Se trova una lettera minuscola lo pone uguale a '*'  */
        if( stringaNascosta[i] >= 97 && stringaNascosta[i] <= 122 ) {
            stringaNascosta[i] = '*';
        }/* fine if */
    }/* fine for */

} /* fine main */


/* allocando la stringa prima nel main, cioè passo le due stringhe dal main per riferimento
...
   stringaNascosta = (char *)calloc( strlen(stringa) + 1, sizeof( char ) );
   nascondiStr(  *stringa, *stringaNascosta ) ;
...

*/


o in questo

/* librerie standard*/
#include <stdlib.h>
#include <string.h>

/* qui passo solo */
void nascondiStr( char *stringaNascosta )
{
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
    size_t i = 0 ;                  /* contatore per il for */
    /* DEFINIZIONI E INIZZIALIZZAZIONI VARIABILI */
    
    /* ciclo per esaminare tutti i caratteri fino a EOF */
    for( int i = 0; stringaNascosta[i] != '{parsed_message}'; i++ ) {

        /* Se trova una lettera minuscola lo pone uguale a '*'  */
        if( stringaNascosta[i] >= 97 && stringaNascosta[i] <= 122 ) {
            stringaNascosta[i] = '*';
        }/* fine if */
    }/* fine for */

} /* fine main */

/*  NEL MAIN
...
    stringaNascosta = (char *)calloc( strlen(stringa) + 1, sizeof( char ) );
	strcpy( *stringaNascosta, *stringa );
	nascondiStr( *stringaNascosta ) ;
... 
*/


EDIT:
quasi certamente un'allocazione/deallocazione sarà necessaria, ma entrambe nella stessa funzione è da preferirsi per evitare eventuali dimenticanze.

'; i++ ) { /* Se trova una lettera minuscola lo pone uguale a '*' */ if( stringaNascosta[i] >= 97 && stringaNascosta[i] <= 122 ) { stringaNascosta[i] = '*'; }/* fine if */ }/* fine for */ } /* fine main */ /* NEL MAIN ... stringaNascosta = (char *)calloc( strlen(stringa) + 1, sizeof( char ) ); strcpy( *stringaNascosta, *stringa ); nascondiStr( *stringaNascosta ) ; ... */


EDIT:
quasi certamente un'allocazione/deallocazione sarà necessaria, ma entrambe nella stessa funzione è da preferirsi per evitare eventuali dimenticanze.

Ultima modifica effettuata da 21/01/16 13:34
21/01/16 14:30
TheDarkJuster
Postato originariamente da Mikelius:
Comunque, quello che chiedevo , scusate se mi sono espresso male, è se si poteva evitare di dover allocare/deallocare il puntatore

"Allocare un puntatore" è una frase senza alcun senso.
Non si allocano valori, si alloca spazio nell'heap, cosa tu faccia con quello spazio non importa.
quando crei una nuova istanza di classe con l'operatore new non allochi una classe, allochi spazio sufficiente per mantenere la classe.

Quello che tu non hai capito è come funziona un puntatore se passato come paramentro ad una funzione.
Quando tu passi a una funzione un puntatore stai passando il primo indirizzo di memoria dello spazio allocato (o non).
La funzione può usare quell'indirizzo di memoria per scrivere sulla memoria interessata!

Ovvio, hai detto alla funzione dov'è la memoria "originale"! *nota che con originale intendo la memoria allocata nell'heap o nello stack in cui vengono mantenuti i dati di interesse (leggibili/scrivibili dalla funzione).

Quindi..... La funzione non ha alcun bisogno di allocare memoria?...... Eh già!

Ma cosa succederebbe se tu allocassi nuova memoria all'interno della suddetta funzione e assegnassi l'indirizzo di base di quella memoria al puntatore parametro di ingresso della funzione? Il puntatore viene passato per valore, quindi ti ritroveresti memoria allocata per nulla, visto che al di fuori della funzione non esisterebbe alcun riferimento a quella memoria! (e come potrebbe? la memoria è stata allocata nella funzione e non ritornata.....).


aaa
21/01/16 14:41
TheDarkJuster
2 Punto: Per tenere traccia di tutte le modifiche ai file, che posso usare?
Git mi pare eccessivo per pochi file.

4 Punto: Ho spezzettato quasi tutto il programma in funzioni più piccole, fatto bene o male?
troppe funzioni non rallentano troppo l'esecuzione?
gli header e i file contenenti le funzioni devono avere lo stesso nome?


La risposta al primo quesito è un parere personale.
2° Punto: git va benissimo, ma se vuoi qualcosa di più semplice e immediato subversion è ciò che fa per te.

4° Punto: Hai fatto bene: ne trae vantaggio la mantenibilità del codice e la sua organizzazione.
Se l'esecuzione viene rallentata dipende dal compilatore, ma in linea di massima i salti incondizionati introducono stalli nella pipeline di una CPU, ma i tempi di attesa sono nella maggior parte dei casi trascurabili.

Gli header vanno spezzati a seconda della classe di funzioni logiche a cui appartengono (e/o a cui appartengono le funzioni di cui si mantengono le firme). Si, vanno spezzati proprio come si divide un programma in funzioni, per la stessa identica ragione!
aaa
21/01/16 14:57
Postato originariamente da TheDarkJuster:

Postato originariamente da Mikelius:
Comunque, quello che chiedevo , scusate se mi sono espresso male, è se si poteva evitare di dover allocare/deallocare il puntatore

"Allocare un puntatore" è una frase senza alcun senso.
Non si allocano valori, si alloca spazio nell'heap, cosa tu faccia con quello spazio non importa.


Giusto, chiedo venia per la castroneria.
Sto studiando dal Deitel , onestamente i puntatori non sono fatti benissimo, potrei veramente aver capito male qualche concetto su di essi, sai per caso qualche testo in cui sono fatti bene?

Per la mia funzione quindi che mi consigli?