Trasformare una stringa

di il
102 risposte

102 Risposte - Pagina 4

  • Re: Trasformare una stringa

    Finora sono arrivato qua, poi potresti darci un 'occhiata?
    
    #include <stdio.h>
    #include <string.h>
    void read_string(char s[], unsigned int dim);
    void escape(char s[], char t[]);//copia la stringa t in s
    
    void main()//qua uso getchar e passo la stringa alla funzione
    {
    	char t[10], s[20];
    	read_string(t, 10);
    	escape(s, t);
    	printf("%s", s);
    }
    void read_string(char s[], unsigned int dim)
    {
    	int i;
    	for (i = 0; i < dim-1 && (s[i] = getchar()) != EOF; ++i)
    		;
    	s[i] = '\0';
    }
    void escape(char s[], char t[])
    {
    	int i, c;
    	for (i = 0; i < strlen(s) ; ++i)
    	{
    		switch (t[i])
    		{
    		case '\n': t[i] = "\\n";s[i] = t[i];
    			break;
    
    		case '\t': t[i] = "\\t";s[i] = t[i];
    			break;
    		default: s[i] = t[i];
    			break;
    		}
    	}
    }
    
  • Re: Trasformare una stringa

    SuperManPC ha scritto:


    Non ho idea di come si faccia per risolvere con l' intero al posto di char
    Semplicemente
    void read_string(char s[], unsigned int dim)
    {
        int c;
        unsigned int i;
        for(i = 0; i < dim - 1 && (c = getchar()) != EOF; ++i)
        {
            s[i] = c;
        }
        s[i] = '\0';
    }

    SuperManPC ha scritto:


    e neanche della dim massima di s...
    Best case:
    char t[10] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', '\0'};
    implica che per l'array s saranno sufficienti 10 elementi.

    Worst case:
    char t[10] = {'\t', '\n', '\t', '\n', '\t', '\n', '\t', '\n', '\t', '\0'};
    quanti elementi richiede s?

    SuperManPC ha scritto:


    Finora sono arrivato qua, poi potresti darci un 'occhiata?
    Compila quel codice?
  • Re: Trasformare una stringa

    Mi sa che non è compilabile...
  • Re: Trasformare una stringa

    Ma perchè per visualizzare la stringa ci vuole per forza una funzione read_string con getchar()?
  • Re: Trasformare una stringa

    SuperManPC ha scritto:


    Ma perchè per visualizzare la stringa ci vuole per forza una funzione read_string con getchar()?
    Comunque se scrivo tab e poi invio e poi ctrl+z vedo 84.
    8 penso che sia riferito all' intero che rappresenta tab e 4 all' intero che rappresenta newline.
  • Re: Trasformare una stringa

    SuperManPC ha scritto:


    Mi sa che non è compilabile...
    Ovviamente, ma ne riparliamo dopo...

    SuperManPC ha scritto:


    Ma perchè per visualizzare la stringa ci vuole per forza una funzione read_string con getchar()?
    La funzione escape() in base a quello che hai detto si aspetta due array di caratteri, di cui t, che è una stringa, servirà come modello per modificare l'array s, il quale dovrà anche lui alla fine costituire una stringa.
    La domanda ora è la seguente: da dove proviene questa stringa t?
    O la definisci direttamente nel codice, per esempio
    int main()
    {
        char s[20];
        escape("1\t2\n\n345\n\0", s);
        ...
    
    oppure la inserisci tramite tastiera. In tal caso come lo vuoi gestire l'input? La funzione read_string() è un modo per farlo utilizzando la funzione getchar(), tutto qui...

    SuperManPC ha scritto:


    Comunque se scrivo tab e poi invio e poi ctrl+z vedo 84.
    8 penso che sia riferito all' intero che rappresenta tab e 4 all' intero che rappresenta newline.
    Posta il codice completo e compilabile che mi permette di riprodurre quanto dici.

    P.S.
    Sto ancora aspettando una risposta relativamente al "worst case" di cui parlavo nel mio precedente post.
  • Re: Trasformare una stringa

    Più di così non riesco a risolvere niente...
    
    #include <stdio.h>
    #include <string.h>
    void read_string(char s[], unsigned int dim);
    void escape(char s[], char t[]);//copia la stringa t in s
    
    void main()//qua uso getchar e passo la stringa alla funzione
    {
    	char t[10], s[20];
    	read_string(t, 10);
    	escape(s, t);
    	printf("%s", s); 
    }
    void read_string(char s[], unsigned int dim)
    {
        int c;
        unsigned int i;
        for(i = 0; i < dim - 1 && (c = getchar()) != EOF; ++i)
        {
            s[i] = c;
        }
        s[i] = '\0';
    }
    void escape(char s[], char t[])
    {
    	int i;
    	for (i = 0; i < strlen(s)-1; ++i)
    	{
    		switch (t[i])
    		{
    		case '\n': t[i] = '\\n';s[i] = t[i];
    			break;
    
    		case '\t': t[i] = '\\t';s[i] = t[i];
    			break;
    		default: s[i] = t[i];
    			break;
    		}
    	}
    }
    
    Non capisco perchè mi dice errata corrispondenza tra signed e unsigned dove c'è i < strlen(s)-1 e non so come risolverlo
    e neanche perchè ci sono troncamenti da int a char dove c'è s = t;
  • Re: Trasformare una stringa

    Se vuoi il mio aiuto devi prima rispondere alla domanda che ti sto facendo ormai da 6 post... ossia
    Best case:
    char t[10] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', '\0'};
    implica che per l'array s saranno sufficienti 10 elementi.

    Worst case:
    char t[10] = {'\t', '\n', '\t', '\n', '\t', '\n', '\t', '\n', '\t', '\0'};
    quanti elementi richiede s?
  • Re: Trasformare una stringa

    S dovrà avere t più almeno una tabulazione e un newline..
  • Re: Trasformare una stringa

    SuperManPC ha scritto:


    S dovrà avere t più almeno una tabulazione e un newline..
    Se da un carattere ne ottieni due ('\t' -> '\\' + 't', nota che '\\t' non è un carattere!) quanto dovrà essere lunga s, in funzione della lunghezza di t, nel caso peggiore?
    Ossia, come ti ha rappresentato Nippolo, in cui tutti i caratteri vanno sdoppiati?

    E nota che hai ancora strlen(s) quando ti è stato spiegato che deve s deve essere una stringa valida per usare strlen…
  • Re: Trasformare una stringa

    Ah evero nel caso peggiore s è 20...
    quindi strlen non posso usarla perchè s non è sempre una stringa valida?
    Allora uso str fatta in casa
  • Re: Trasformare una stringa

    SuperManPC ha scritto:


    Ah evero nel caso peggiore s è 20...
    Sbagliato... prova a scrivere per intero la stringa s associata a
    char t[10] = {'\t', '\n', '\t', '\n', '\t', '\n', '\t', '\n', '\t', '\0'};

    SuperManPC ha scritto:


    quindi strlen non posso usarla perchè s non è sempre una stringa valida?
    strlen() si applica sulle stringhe, ma s nella funzione escape() è solo un array di caratteri non inizializzato e che quindi può contenere di tutto.

    SuperManPC ha scritto:


    Allora uso str fatta in casa
    No, in quanto strlen_fatta_in_casa() funziona nello stesso modo della strlen() standard.
  • Re: Trasformare una stringa

    SuperManPC ha scritto:


    Ah evero nel caso peggiore s è 20...
    quindi strlen non posso usarla perchè s non è sempre una stringa valida?
    Allora uso str fatta in casa
    s è una stringa non inizializzata che stai riempiendo manualmente in escape.
    Il fatto è che non devi proprio ciclare in base alla lunghezza di s ma in base a t. E non puoi avere lo stesso indice per t e per s.
    Per escape farei una cosa così: [CODE] j = 0 per ogni carattere c di t: se c è '\t': s[j++] = '\\' s[j++] = 't' altrimenti se c è '\n': ... altrimenti: s[j++] = c s[j] = '\0' Per la lunghezza di s segui bene il post di Nippolo
  • Re: Trasformare una stringa

    S nel caso peggiore sarebbe 17 caratteri più il terminatore quindi 18
  • Re: Trasformare una stringa

    _Achille ha scritto:


    SuperManPC ha scritto:


    Ah evero nel caso peggiore s è 20...
    quindi strlen non posso usarla perchè s non è sempre una stringa valida?
    Allora uso str fatta in casa
    s è una stringa non inizializzata che stai riempiendo manualmente in escape.
    Il fatto è che non devi proprio ciclare in base alla lunghezza di s ma in base a t. E non puoi avere lo stesso indice per t e per s.
    Per escape farei una cosa così: [CODE] j = 0 per ogni carattere c di t: se c è '\t': s[j++] = '\\' s[j++] = 't' altrimenti se c è '\n': ... altrimenti: s[j++] = c s[j] = '\0' Per la lunghezza di s segui bene il post di Nippolo
    Ma qua perchè più c e non direttamente t?
    Quindi c'è un ciclo con dentro uno switch per esempio?
Devi accedere o registrarti per scrivere nel forum
102 risposte