n° 154
Settembre 2010
Settembre 09, 2010, 09:20:27 pm *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia: Usi il PC già da qualche anno? partecipa alla discussione nell'area Retrocomputing
 
   Indice   Linux Windows Internet videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


 SONDAGGIO
Saresti interessato a seguire online dei videocorsi?
Sì | No
Se sì, quali di questi argomenti sarebbero di tuo gradimento?

.NET Framework   PHP
ASP.NET Python
Attività SEO Ruby
C# Silverlight
C/C++ Visual Basic .NET
Java Windows Azure
Java per Android Windows Phone 7
Objective-C (iPhone / iPad) Altri

Attenzione! Per partecipare al sondaggio bisogna essere registrati al forum




* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: [C] funzione e allocazione dinamica  (Letto 859 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
Ale147
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 3


Mostra profilo E-mail
« inserita:: Febbraio 15, 2010, 06:40:13 pm »

ciao a tutti!!! dovrei creare in c una funzione char *Text() che legga da standard input un testo (fino al carattere di fine testo) e lo restituisca in una stringa allocata dinamicamente modificato.
Come potrei fare.
Grazie per l'aiuto
Registrato
VBeXtreme
Full Member
***

Karma: +13/-77
Scollegato Scollegato

Messaggi: 515



Mostra profilo
« Risposta #1 inserita:: Febbraio 15, 2010, 08:00:27 pm »

non ho ben capito,in poche parole prelevi i caratteri in un array e lo vuoi copiare in uno dinamico,per creare il dinamico puoi usare malloc per copiarlo puoi usare sia strcpy sia memcpy.ma potresti anche copiare direttamente nell'array dinamico.per prelevare i caratteri potresti usare getchar.
magari se la prossima volta sei più chiaro ti aiuto meglio
Registrato

Ragionare non è nient’altro che calcolare
"Thomas Hobbes"
Ale147
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 3


Mostra profilo E-mail
« Risposta #2 inserita:: Febbraio 19, 2010, 07:17:48 pm »

l'es da svolgere è questo:

Si scriva una funzione char *fixText() che legga da standard input un testo (fino ad EOF) e lo restituisca in una stringa allocata dinamicamente modificato come segue:
L'iniziale della prima parola, e le iniziali di tutte le parole che seguono un '.', un '?' o un '!' (anche se separato da spazi) vengono rese maiuscole;
Viene aggiunto uno spazio dopo ogni carattere ',', ';', ':', '.', '?', '!', se non già presente;
Viene rimosso l'eventuale spazio dopo ogni carattere '\'' (apostrofo);
Ogni sequenza di due o più spazi viene sostituita da uno spazio singolo.
Ad esempio, se da standard input viene immesso:

questa è una   frase;ora siamo dopo\n
il punto    e virgola!\n
questa frase  segue un punto.

la funzione restituisce la stringa:
"Questa è una frase; ora siamo dopo\nil punto e virgola! \nQuesta frase segue un punto. "



mma nn so come farlo
Registrato
VBeXtreme
Full Member
***

Karma: +13/-77
Scollegato Scollegato

Messaggi: 515



Mostra profilo
« Risposta #3 inserita:: Febbraio 19, 2010, 08:11:28 pm »

Ultima cosa,devi prelevare il testo e poi modificarlo o puoi riempire l'array passo passo durante la digitazione?
Cmq per allocare memoria dinamica devi usare Malloc:

Codice:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char* s;
    const int CIAO_MONDO_LEN = 11; //10+1\0
   
    s=(char *) malloc(CIAO_MONDO_LEN); // alloco la memoria dinamicamente

    if (s != NULL) //Controllo di esserci riuscito
        {
            strcpy(s,"Ciao Mondo"); //Metto il valore nella memoria
            printf("%s",s); //visualizzo
            free(s); //Libero la memoria usata
        }
    else    //Se non ci riesco
        {
            puts("Caspiterina non sono riuscito ad allocare la memoria!");
        }

    return 0;
}

Per ulteriori chiarimenti chiedi pure.
Registrato

Ragionare non è nient’altro che calcolare
"Thomas Hobbes"
Ale147
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 3


Mostra profilo E-mail
« Risposta #4 inserita:: Febbraio 21, 2010, 12:41:20 pm »

Credo che devo leggere prima tutto il testo e poi allocarlo in una stringa.
Il processo per l'allocazione dinamica ora mi è molto più chiaro.
Per leggere il testo uso una funzione tipo char *fgets() Che?!?
Grazie mille per l'aiuto Sorriso Sorriso
Registrato
VBeXtreme
Full Member
***

Karma: +13/-77
Scollegato Scollegato

Messaggi: 515



Mostra profilo
« Risposta #5 inserita:: Febbraio 22, 2010, 10:35:55 pm »

Ti riporto un codice abbastanza commentato,è una funzione che incorpora vari metodi per risolvere il problema,se non sono stato chiaro in qualcosa o hai bisogno di qualche altro suggerimento io sono qui.
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *readdinamic(int metodo)
{
    const int BYTE_READ = 80;
    char *lineptr;
    char line[BYTE_READ];
    char c;
    int l;


    lineptr=malloc(BYTE_READ); //alloco lo spazio di lineptr

    if (line!=NULL) // se è riuscita l'allocazione
    {
        switch (metodo)
        {
            case 1:
                //METODO 1 leggo direttamente in ptr usando scanf
                scanf("%s",lineptr); //prelevo il valore
                break;
            case 2:
                //METODO 2 leggo prima in un array e poi lo copio nella
                //         variabile dinamica sempre con scanf
                scanf("%s",line);
                strcpy(lineptr,line); //copio i dati dall'array al puntatore
                break;

            case 3:
                //METODO 3 Leggo carattere per carattere direttamente
                //         nel puntatore
                l=0;
                while((c=getchar())!='\n' && c !=EOF) //fino a che non è a nuovalinea
                {
                    if (l++ < BYTE_READ-1) //controllo di non aver superato il buffer e aumento il contatore
                        *lineptr++ = c; //copio il carattere e aumento il puntatore
                }
                *lineptr='\0';//Metto la fine
                lineptr-=l; //Ritorno all'inizio
                break;

            case 4:
                //METODO 3 Leggo carattere per carattere nel buffer
                //         poi lo copio nel puntatore
                l=0;
                while((c=getchar())!='\n' && c !=EOF) //fino a che non è a nuovalinea
                {
                    if (l < BYTE_READ-1) //controllo di non aver superato il buffer
                            line[l++] = c; //copio il carattere e aumento il buffer
                }
                line[l]='\0';//Metto la fine
                strcpy(lineptr,line); //copio i dati dall'array al puntatore
                break;

            case 5:
                //METODO 4 Piu compatto usando puntatore
                l=0;
                while((*lineptr++=getchar())!='\n' && c !=EOF && l++<BYTE_READ-1);
                *lineptr='\0';//Metto la fine
                lineptr-=++l; //Ritorno all'inizio
                break;

        }
    }
    return lineptr;
}

int main()
{
    int i;
    char *value;

    //TESTO TUTTI I METODI
    for (i=0;i<6;i++)
    {
        value=readdinamic(5);
        if (value!=NULL)// CONTROLLO CHE PUNTI A QUALCoSA
        {
            printf("%s",value);
            free(value);
        }
    }
}
Registrato

Ragionare non è nient’altro che calcolare
"Thomas Hobbes"
Max.Riservo
Global Moderator
Sr. Member
*****

Karma: +19/-0
Scollegato Scollegato

Messaggi: 716



Mostra profilo
« Risposta #6 inserita:: Febbraio 22, 2010, 11:46:12 pm »

Nota per VbExtreme:
Mi sembra che Ale147 non abbia completamente in chiaro cosa richiede l' esercizio e/o che non sia molto esperto di programmazione e che, soprattutto NON abbia fornito alcuno stralcio di codice da cui partire !
Io personalmente (ma credo che la pensino come me altri frequentatori ... non necessariamente moderatori) ritengo che sia diseducativo fornire la pappa pronta, come sia pure rischio di confusione fornire troppe alternative di codice soprattutto se non richieste (e magari non comprensibili dal destinatario).
Ovviamente non sto dicendo che non devi rispondere a chi richiede aiuto ma, ti suggerisco di fare in modo che chi richiede l' aiuto del forum fornisca maggiori dettagli possibili in merito al suo problema e che soprattutto fornisca qualche pezzo di codice da cui iniziare a ragionare. Partendo da qualche pezzo di codice si possono capire le conoscenze di chi pone le domande e si possono proporre soluzioni più mirate ( e magari si possono anche correggere passi falsi iniziali).
Spero che venga colto lo spirito del mio messaggio e spero anche che non seguano polemiche tali da dover chiudere il thread.
Registrato

I Moderatori invitano tutti gli Utilizzatori del forum a prendere visione del REGOLAMENTO e a rispettarlo.
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2009 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page