Trasformare una stringa

di Anonimizzato28411 il
102 risposte

102 Risposte - Pagina 5

  • SuperManPC ha scritto:


    Ma qua perchè più c e non direttamente t[ i ]?
    È pseudocodice di un ciclo for each… non credo sia così un problema

    E comunque no, non sono 18 caratteri. 9 caratteri da sdoppiare e 1 terminatore…
  • Ho cominciato a contare da 0 io
  • Achille potresti dare un' occhiata e escape?
    
    void escape(char s[], char t[])
    {
        int i, j, c;
        for (i = 0, j = 0; i, j < strlen(t) - 1; i++)
        {
            switch (t[i]) {
            case '\t':
                s[j++] = '\\';
                s[j++] = 't';
            case '\n':
                s[j++] = '\\';
                s[j++] = 'n';
            default:
                s[j++] = t[i];
            }
        }
        s[j] = '\0';
    }
    
    é esattamente così che dovrebbe essere?
  • Ora è compilabile però non funziona benissimo in quanto dopo la tabulazione la parola che ho scritto non viene visualizzata
    
    #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
    //int strlen_fatta_in_casa(char str[]);
    
    void main()
    {
    	char t[10], s[30];
    	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, j, c;
        for (i = 0, j = 0; i < strlen(t) - 1, j < strlen(t) - 1; i++)
        {
            switch (t[i]) {
            case '\t':
                s[j++] = '\\';
                s[j++] = 't';
            case '\n':
                s[j++] = '\\';
                s[j++] = 'n';
            default:
                s[j++] = t[i];
            }
        }
        s[j] = '\0';
    }
    /*int strlen_fatta_in_casa(char str[])
    {
    	int i;
    	for (i = 0; str[i] != '\0'; ++i)
    		;
    	return i;
    }*/
    
  • SuperManPC ha scritto:


    s[30]
    Ma sì, meglio abbondare!

    SuperManPC ha scritto:


    Ora è compilabile però non funziona benissimo in quanto dopo la tabulazione la parola che ho scritto non viene visualizzata
    Secondo te come viene valutata questa condizione che hai scritto?
    i < strlen(t) - 1, j < strlen(t) - 1
    P.S.
    Se fossi in te aggiungerei qualche break!
  • Grazie Nippolo! Comunque due cicli nidificati no vero(visto che ci vogliono 2 indici)?
  • Di niente, ma sarei curioso di vedere il codice finale!

    SuperManPC ha scritto:


    Comunque due cicli nidificati no vero(visto che ci vogliono 2 indici)?
    Non esiste alcuna regola fissa al riguardo, e nel caso specifico non vedo l'utilità di un secondo ciclo... d'altronde anche volendo cosa andresti a ciclare con un secondo ipotetico for?
  • Nippolo ha scritto:


    Di niente, ma sarei curioso di vedere il codice finale!

    SuperManPC ha scritto:


    Comunque due cicli nidificati no vero(visto che ci vogliono 2 indici)?
    Non esiste alcuna regola fissa al riguardo, e nel caso specifico non vedo l'utilità di un secondo ciclo... d'altronde anche volendo cosa andresti a ciclare con un secondo ipotetico for?
    Bho si infatti...
  • Per ora è questo...
    
    #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
    //int strlen_fatta_in_casa(char str[]);
    
    void main()//qua uso getchar e passo la stringa alla funzione
    {
    	char t[10], s[30];
    	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, j, c;
        for (i = 0, j = 0; i < strlen(t) - 1, j < strlen(t) - 1; i++)
        {
            switch (t[i]) {
            case '\t':
                s[j++] = '\\';
                s[j++] = 't';
            case '\n':
                s[j++] = '\\';
                s[j++] = 'n';
            default:
                s[j++] = t[i];
            }
        }
        s[j] = '\0';
    }
    
  • Non lo so come viene valutata : i < strlen(t) - 1, j < strlen(t) - 1
  • Perché non sostituirla con t[ i ] direttamente?

    Lo conosci l'operatore && ?

    E comunque se t ="X", ad esempio, strlen(t) = 1 e hai la condizione i < 1 - 1, cioè i < 0, cioè 0 < 0 che è falso e quindi esci dal for anche con &&
  • Semplicemente non va alcuna condizione su j. Nippolo ti ha fatto ragionare 20 post per capire la dimensione massima di s quindi j non eccederà mai quella.
    Anche perché che senso ha che pure j sia minore della lunghezza della stringa t, quando j è una variabile nata proprio per eccedere questo limite.

    A me sembra tu non abbia capito minimamente “l’algoritmo”, e queste condizioni a caso lo confermano…
  • _Achille ha scritto:


    Semplicemente non va alcuna condizione su j. Nippolo ti ha fatto ragionare 20 post per capire la dimensione massima di s quindi j non eccederà mai quella.
    Anche perché che senso ha che pure j sia minore della lunghezza della stringa t, quando j è una variabile nata proprio per eccedere questo limite.

    A me sembra tu non abbia capito minimamente “l’algoritmo”, e queste condizioni a caso lo confermano…
    Ma va ho solo sbagliato
  • _Achille ha scritto:


    A me sembra tu non abbia capito minimamente “l’algoritmo”, e queste condizioni a caso lo confermano…
    Cinque pagine di post su un codice banale, anche per uno studente che inizia a conoscere il linguaggio.

    Confermo che SupermanPC non ha idea dell'algoritmo né di quello che scrive. Ha bisogno di molto, molto più tempo sulle basi del linguaggio, ma intendo proprio le basi.
  • oregon ha scritto:


    _Achille ha scritto:


    A me sembra tu non abbia capito minimamente “l’algoritmo”, e queste condizioni a caso lo confermano…
    Cinque pagine di post su un codice banale, anche per uno studente che inizia a conoscere il linguaggio.

    Confermo che SupermanPC non ha idea dell'algoritmo né di quello che scrive. Ha bisogno di molto, molto più tempo sulle basi del linguaggio, ma intendo proprio le basi.
    Ma va per una condizione messa a caso che non ho tolto
Devi accedere o registrarti per scrivere nel forum
102 risposte