Partage
  • Partager sur Facebook
  • Partager sur Twitter

fonction substr()

    24 janvier 2007 à 18:27:04

    Bonjour a tous

    Alors voila il y a quelques temps j'avais besoin de le fonction substr() comme elle n'existe pas en C je me la suis fais

    et j'ai obtenu ceci
    char* substr(const char* tab, int debut, int len)
    {
        int i;
        char* str = malloc(sizeof(char) * strlen(tab));

        for(i=debut;i<debut+len;i++)
        {
            str[i-debut] = tab[i];
        }

        return str;
    }


    C'est le seul moyen que j'ai trouver et j'aimerais savoir comment on peut l'arranger si c'est possible
    • Partager sur Facebook
    • Partager sur Twitter
      24 janvier 2007 à 20:13:25

      déjà, au liue de faire :
      char* str = malloc(sizeof(char) * strlen(tab));

      tu peux faire simplement :
      char* str = malloc(len + 1);


      et aussi vérifié que debut+len ne dépasse pas strlen(tab)
      • Partager sur Facebook
      • Partager sur Twitter
        24 janvier 2007 à 20:17:17

        Citation : minirop

        déjà, au liue de faire :

        char* str = malloc(sizeof(char) * strlen(tab));


        tu peux faire simplement :

        char* str = malloc(len + 1);



        Ce qui, entre autres, a l'avantage d'être correct !

        Citation : akhenathon



            for(i=debut;i<debut+len;i++)
            {
                str[i-debut] = tab[i];
            }



        Le principe de la boucle est correct (je n'ai pas vérifié le code), mais un strcpy() strncpy() devrait simplifier le code...
        • Partager sur Facebook
        • Partager sur Twitter
        Music only !
          24 janvier 2007 à 20:33:36

          ok merci bcp pour toute ces suggestions je vais modif un peu cette fonction et je vous dit si j'ai un problème

          edit: nikel minirop avant il y avait quelque petit bug quand je ne prenais qu'un seul caractères mais maintenant tout marche comme je le penser

          et -ed- tu pourrais m'expliquer le truc du strcpy() parce que je ne vois pas trop
          • Partager sur Facebook
          • Partager sur Twitter
            24 janvier 2007 à 21:06:23

            Citation : -ed-

            mais un strcpy() devrait simplifier le code...


            un memcpy serait plus optimisé puisqu'on connait la taille du bloc, suffira de penser a terminer la chaine par le \0 final.
            • Partager sur Facebook
            • Partager sur Twitter
              24 janvier 2007 à 22:21:23

              Citation : akhenathon

              et -ed- tu pourrais m'expliquer le truc du strcpy() parce que je ne vois pas trop


              Bah, en fait ça marche pas. Il faut utiliser strncpy, strncat() ou memcpy().

              • Partager sur Facebook
              • Partager sur Twitter
              Music only !
                24 janvier 2007 à 22:42:34

                c'est bien ce que je penser
                • Partager sur Facebook
                • Partager sur Twitter
                  24 janvier 2007 à 23:25:16


                  char *substr (const char *s, int deb, int len)
                  {
                     char *str = calloc (len + 1, sizeof *str);
                     strncpy (str, --deb + s, len)
                     return str;                         
                  }
                     /*/ --deb car substr("salut", 1, 2) doit retourner /*/
                     /*/ "sa" et non pas "al".                          /*/



                  Pas testé.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 janvier 2007 à 1:09:51

                    Citation : ddx39


                    char *substr (const char *s, int deb, int len)
                    {
                       char *str = calloc (len + 1, sizeof *str);
                       strncpy (str, --deb + s, len)
                       return str;                         
                    }
                       /*/ --deb car substr("salut", 1, 2) doit retourner /*/
                       /*/ "sa" et non pas "al".                          /*/



                    Pas testé.


                    Un peu simpliste... Le --, j'ai pas compris...

                    Un petit coup de tests unitaire. Cette fonction peut poser beaucoup de problèmes...

                    Je pense avoir couvert tous les cas...

                    Le code manquant est là :

                    http://mapage.noos.fr/emdel/clib.htm

                    #include <stdlib.h>
                    #include <string.h>

                    #ifdef TEST
                    #include "ed/inc/sys.h"
                    #include "ed/inc/sysalloc.h"
                    #endif

                    /* DUT */
                    char *substr_dyn (const char *const s, size_t const deb, size_t const len)
                    {
                       char *str = NULL;
                       if (s != NULL)
                       {
                          size_t const len_s = strlen (s);
                          if (deb <= len_s
                          && len <= len_s
                          && deb + len <= len_s)
                          {
                             size_t const size = (len + 1) * sizeof *str;
                             str = malloc (size);
                             if (str != NULL)
                             {
                    #ifdef TEST
                                LIM_PTR (str, size);
                    #endif
                                *str = 0;
                                if (len > 0)
                                {
                                   strncat (str, s + deb, len);
                    #ifdef TEST
                                   CHK_PTR (str, size);
                    #endif
                                }
                             }
                          }
                       }
                       return str;
                    }

                    #ifdef TEST
                    /* ---------------------------------------------------------------------
                       (c) ED 2007
                       Project      : ut
                       Function     : main function
                       Module       : UT
                       File         : ut.c
                       Created      : 24-01-2007
                       Modified     : 24-01-2007
                       --------------------------------------------------------------------- */


                    /* ---------------------------------------------------------------------
                       Log

                       0.0 24-01-2007 Created

                       --------------------------------------------------------------------- */

                    #ifdef __cplusplus
                    #error This is not C++. Please use a C compiler.
                    #endif

                    #ifdef DBG_SYSALLOC
                    #include "ed/inc/sysalloc.h"
                    #endif
                    #include <stdio.h>
                    #include <stdlib.h>

                    /* macros ============================================================== */

                    #define VER "0.0"
                    #define PRJ "Unit Test"
                    #define MOD "UT"
                    #define CPY "(c) ED 2007"

                    #define N(a) (sizeof(a)/sizeof*(a))

                    /* constants =========================================================== */

                    /* types =============================================================== */

                    /* structures ========================================================== */

                    /* private functions =================================================== */

                    /* ---------------------------------------------------------------------
                       banner ()
                       ---------------------------------------------------------------------

                       ---------------------------------------------------------------------
                       I:
                       O:
                       --------------------------------------------------------------------- */

                    static void banner (void)
                    {

                       printf ("\n" PRJ " " CPY " " VER "\n\n");

                    }

                    /* ---------------------------------------------------------------------
                       tu ()
                       ---------------------------------------------------------------------

                       ---------------------------------------------------------------------
                       I:
                       O:
                       --------------------------------------------------------------------- */

                    static int tu (void)
                    {
                       int ret = EXIT_SUCCESS;

                       struct test
                       {
                          unsigned long nb;
                          struct in
                          {
                             char const *s;
                             int beg;
                             int len;
                          }
                          in;
                          struct out
                          {
                             char const *s;
                          }
                          out;
                       };

                       static struct test a[] =
                       {
                          {10, {NULL, 0, 0}, {NULL}},
                          {11, {"", 0, 0}, {""}},
                          {12, {"", -1, 0}, {NULL}},
                          {13, {"", 0, -1}, {NULL}},
                          {14, {"", 0, 1}, {NULL}},
                          {15, {"", -1, 0}, {NULL}},

                          {20, {"a", 0, 0}, {""}},
                          {21, {"a", 0, 1}, {"a"}},
                          {22, {"a", 0, 2}, {NULL}},
                          {23, {"a", 1, 0}, {""}},
                          {24, {"a", 1, 1}, {NULL}},
                          {25, {"a", 2, 0}, {NULL}},

                          {30, {"ab", 0, 0}, {""}},
                          {31, {"ab", 0, 1}, {"a"}},
                          {32, {"ab", 1, 0}, {""}},
                          {33, {"ab", 1, 1}, {"b"}},
                          {34, {"ab", 0, 2}, {"ab"}},
                          {35, {"ab", 3, 0}, {NULL}},
                          {36, {"ab", 0, 3}, {NULL}},
                          {36, {"ab", 2, 0}, {""}},
                          {36, {"ab", 2, 1}, {NULL}},
                          {36, {"ab", 2, 2}, {NULL}},
                       };

                       int err = 0;
                       size_t i;

                       for (i = 0; i < N (a) && !err; i++)
                       {
                          struct test const *p = a + i;

                          char *s_out = substr_dyn (p->in.s, p->in.beg, p->in.len);
                          if (s_out != NULL)
                          {
                             ASSERT(p->out.s != NULL);
                             if (strcmp (s_out, p->out.s) != 0)
                             {
                                printf ("att='%s'. lu='%s'\n", p->out.s, s_out);
                                printf ("ERROR at test %lu\n\n", p->nb);
                                err = 1;
                             }
                             free (s_out), s_out = NULL;
                          }
                          else
                          {
                             if (p->out.s != NULL)
                             {
                                printf ("att=%p. lu=%p\n", p->out.s, s_out);
                                printf ("ERROR at test %lu\n\n", p->nb);
                                err = 1;
                             }
                          }
                             ASSERT(s_out == NULL);
                       }

                       if (!err)
                       {
                          puts ("\nP A S S E D\n");
                       }

                       return ret;
                    }

                    /* ---------------------------------------------------------------------
                       onexit ()
                       ---------------------------------------------------------------------

                       ---------------------------------------------------------------------
                       I:
                       O:
                       --------------------------------------------------------------------- */

                    static void onexit (void)
                    {

                    #ifdef DBG_SYSALLOC
                       sys_mem_trace ();
                    #endif

                    #ifdef DEVCPP
                       system ("pause");
                    #endif

                    }

                    /* public functions ==================================================== */

                    /* ---------------------------------------------------------------------
                       main ()
                       ---------------------------------------------------------------------

                       ---------------------------------------------------------------------
                       I:
                       O:
                       --------------------------------------------------------------------- */

                    int main (void)
                    {
                       int ret;

                    #ifdef DBG_SYSALLOC
                       static char Trace[1 << 8];

                       SYS_INIT (Trace, OFF);
                    #endif

                       atexit (onexit);

                       banner ();
                       ret = tu ();
                       return ret;
                    }

                    /* ---------------------------------------------------------------------
                       Generated by 'new.exe' (c) ED 3.2
                       Powered by C-code generator library  1.2
                       --------------------------------------------------------------------- */

                    #endif

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Music only !
                      25 janvier 2007 à 12:48:19

                      Citation : ddx39


                      char *substr (const char *s, int deb, int len)
                      {
                         char *str = calloc (len + 1, sizeof *str);
                         strncpy (str, --deb + s, len)
                         return str;                         
                      }
                         /*/ --deb car substr("salut", 1, 2) doit retourner /*/
                         /*/ "sa" et non pas "al".                          /*/



                      Erreur en ce basant sur la fonction de php substr("salut", 1, 2) doit retourner "al" et non "sa"
                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 janvier 2007 à 18:08:36

                        Ah oki, j'ai du confondre avec le substr() de SQL, d'où le --
                        • Partager sur Facebook
                        • Partager sur Twitter
                          25 janvier 2007 à 22:29:15

                          oui j'avais compris pourquoi tu avais mis le --
                          • Partager sur Facebook
                          • Partager sur Twitter

                          fonction substr()

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown