Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    55

    [C-Stringhe]Mi stavo chiedendo..

    Bhè come avete visto ultimamente sto giochicchiando un po con il C..e le mie conoscenze a quanto pare sono ancora estremamente limitate
    Però volevo provare a fare un programmino che mi modificasse un testo secondo un determinato codice...E un altro programma che decodifichi il testo per riportarlo al suo reale contenuto..


    A questo punto mi stavo chiedendo..E' possibile modificare in una stringa un pezzo di testo con uno più grande o più piccolo ?...
    In pratica il programma dovrebbe aprire un file e inserire il testo in una stringa...ad ogni lettera del testo andrà sostituito un codice di più lettere, oppure determinate parole andranno sostituite con dei caratteri speciali...Per esempio
    La lettera 'a' andrà sostituita con "Co2"..
    e il testo "cibo" con '►'

    Ora...Per fare ciò dovrei per forza spostare in avanti (o indietro) ogni lettera della stringa che viene dopo il punto sostituito?
    Ovviamente prima andrà calcolato il nuovo spazio allocato con un calcolo lungo e complicato..(nel caso usi stringhe dinamiche e non statiche)
    E nel caso di una stringa statica?


    Non c'è una soluzione più semplice? VVoVe: :master:

  2. #2
    Sia che allochi staticamente o dinamicamente, potrebbe tornarti utile la:
    codice:
        #include <string.h>
    
         void *
         memmove(void *dst, const void *src, size_t len);
    
    DESCRIPTION
         The memmove() function copies len bytes from string src to string dst.
         The two strings may overlap; the copy is always done in a non-destructive
         manner.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    Moderazione

    Va bene l'euforia... ma il titolo della discussione, come da Regolamento, non deve essere trascurato. "Mi stavo chiedendo..." non dice cosa ti stavi chiedendo, che è poi il succo della discussione.

    Aggiusto io.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    55
    Chiedo scusa x l'errore..pensavo che specificare l'argomento insieme al tipo di linguaggio bastasse..Pardon

    Per MacApp...l'ho provato il memmove..ma penso che non sia utile per quel che devo fare..



    Per esempio...carico il testo


    <<Ciao caro, sono Michele ti scrivo per dirti...>>

    ora con un algoritmo di ricerca trovo la parola "Michele" e lo voglio sostituire con X..

    se uso memmove mi sostituisce la prima lettera di Michele con X e non scrive più il seguito
    Se invece uso una parola più lunga invece della lettera X, mi mangia i caratteri seguenti..esempio


    sostituisci Michele con X attraverso memmove mi da

    <<Ciao caro, sono X>>

    sostituisci Michele con Giancarlo attraverso memmove mi da

    <<Ciao caro, sono Giancarloi scrivo per dirti...>>

    E leggendo la spiegazione di memmove penso sia normale e non sia per come ho scritto il codice..perchè memmove copia le informazioni dei blocchi di memoria del secondo parametro, nei blocchi di memoria del primo parametro...Quindi se il secondo è più grande del primo, i byte in più vanno a sovrascrivere quelli che riguardano il testo che segue

  5. #5
    'ste donne...
    Codice PHP:
    /* 

    8 july 2009, by MacApp 
    Just a memmove sample, zero errors zero warnings. 

    $ gcc --version 
    i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367) 
    Copyright (C) 2005 Free Software Foundation, Inc. 


    $ gcc -Wall -ansi -pedantic -Wextra -Wconversion main.c 

    $ ./a.out 
    1.9 - Ciao Pia, sono MacApp ti scrivo per dirti...;
    2.9 - Ciao Fabrizia, sono MacApp ti scrivo per dirti...;
    3.9 - Ciao Clara, sono MacApp ti scrivo per dirti...;
    4.9 - Ciao Paola, sono MacApp ti scrivo per dirti...;
    5.9 - Ciao Lucia, sono MacApp ti scrivo per dirti...;
    6.9 - Ciao Mamma, sono MacApp ti scrivo per dirti...;
    7.9 - Ciao Zia, sono MacApp ti scrivo per dirti...;
    8.9 - Ciao Nonna, sono MacApp ti scrivo per dirti...;
    9.9 - Ciao Nipotina, sono MacApp ti scrivo per dirti...;
    bye bye ;-)

    */ 

    #include <stdio.h> 
    #include <string.h> 

    #define IG_DIM_OF_ARRAY(theArray) ((sizeof (theArray))/(sizeof (theArray [0]))) 

    int main (void){ 
        const 
    char kStrWomanTag []= "DONNA"
        
    char aBuffer [1024]; 
        
    sprintf (aBuffer"Ciao %s, sono MacApp ti scrivo per dirti..."kStrWomanTag); 
        { 
    /* extra block */ 
            
    const size_t aOriginalBufferLength strlen (aBuffer); 
            
    char kWomanTagPtr strstr (aBufferkStrWomanTag); 
            const 
    size_t aSentenceToMoveLength strlen (aBuffer) - (kWomanTagPtr aBuffer IG_DIM_OF_ARRAY (kStrWomanTag)); 
            const 
    char kMixOfWomen []={ 
                
    "Pia""Fabrizia""Clara""Paola""Lucia""Mamma""Zia""Nonna""Nipotina" 
            
    }; 
             
            
    size_t i 0
            
    size_t aOldWomanNameLength IG_DIM_OF_ARRAY (kStrWomanTag) - 1
            for (
    0IG_DIM_OF_ARRAY (kMixOfWomen); ++i){ 
                const 
    size_t aNewWomanNameLength strlen (kMixOfWomen [i]); 
                 
                
    memmove (kWomanTagPtr aNewWomanNameLengthkWomanTagPtr aOldWomanNameLengthaSentenceToMoveLength 1); 
                
    memmove (kWomanTagPtrkMixOfWomen [i], aNewWomanNameLength); 

                
    aBuffer [aOriginalBufferLength IG_DIM_OF_ARRAY (kStrWomanTag) + aNewWomanNameLength 1] = 0
                
    aOldWomanNameLength aNewWomanNameLength
                 
                
    printf ("%lu.%lu - %s;\n"i+1IG_DIM_OF_ARRAY (kMixOfWomen), aBuffer); 
            } 
        } 
        
    printf ("bye bye ;-)\n"); 
        return 
    0

    ;-)

    EDIT: osserva che il "lavoro" è stato fatto andando a cercare il tag DONNA in buffer, e tramite una doppia memmove (in realtà la seconda memmove puoi sostituirla con una memcpy perché non c'è rischio di overlap) sostituendolo con le varie donne impostate nel contenitore di donne, senza utilizzare buffer extra di copia. In output ti viene presentato di volta in volta il contenuto del buffer. Se puoi appoggiarti ad un buffer extra di copia, allora puoi semplificare moltissimo facendo robe del tipo:
    codice:
    sprintf (aExtraBuffer, "Ciao %s, sono MacApp ecc..", kMixOfWomen [i]);

  6. #6
    easy...


    non mi ricordo se fa qualche warning perchè la scrissi un pò di tempo fa:

    codice:
    void es_04_02_4() {
    	char *text= "Nel mezzo del cammin di nostra vita, nel mezzo del cammin.";
    	char *search = "mezzo";
    	char *replace = "replace";
    	char *currentSearch = text;
    	char *newText;
    
    	size_t newTextLen = 0;
    
    	size_t iText=0;
    	size_t iNewText=0;
    
    	newText = (char *)calloc(1,sizeof(char));
    
    	//printf("Text=>%d\nnewText=>%d\n\n",text,newText);
    	while( (currentSearch=strstr(text+iText,search)) != NULL )  {
    
    		newTextLen = strlen(newText) + strlen(text) - iText;
    		newText = (char *)realloc(newText, ( newTextLen ) * sizeof(char) );
    		
    		//> Aggiungo i dati alla nuova frase
    		strncat(newText+iNewText,text+iText, currentSearch-( text+iText ) );
    		
    		//> Se è presente la parola da sostituire l'aggiungo
    		if(strlen(replace)>0)
    			strcpy( newText+strlen(newText),replace );
    
    		//> Aggiorno gli indici delle frasi
    		iNewText += currentSearch-( text+iText ) + strlen(replace);
    		iText += currentSearch-(text+iText) + strlen(search);
    	}
    
    	//> Copio la parte finale della stringa
    	strcpy( newText+iNewText,text+iText );
    
    	printf("Testo Originale [%s]\nTesto Modificato: [%s].\nSottostringa: [%s]\n",text,newText,search);
    }
    enjoy

  7. #7
    Originariamente inviato da xnavigator
    easy...


    non mi ricordo se fa qualche warning perchè la scrissi un pò di tempo fa:
    Ricordo questo codice... era in una discussione in cui chiedevi se andava bene, se non ricordo male.
    ---EDIT---
    Ecco qua.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Originariamente inviato da MItaly
    Ricordo questo codice... era in una discussione in cui chiedevi se andava bene, se non ricordo male.
    ---EDIT---
    Ecco qua.
    quella discussione era nata per chiedere se qualcuno mi faceva il codice

  9. #9
    E infatti mi ricordavo male.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    55
    Quindi da quel che ho capito l'unica tecnica buona è quella di usare una 3° stringa d'appoggio dove poi riscrivere l'intero testo modificato?

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.