user@linuxtrack:~ $ python -c 'print("Soyez les bienvenus !")'

Vous n'êtes pas identifié(e).

#1 17-01-2014 15:59:07

WarLocG
#! modo de compet

petite fonction de decoupe de chaine en C - strnsplit()

Je l'ai évoqué sur le chat irc et je l'ai nettoyé un peu, plus mis dans une lib séparé pour plus de facilité, la voici:

{ util.h }

[== C++ ==]
/* 
 * This lib contain the strnsplit function. Just import it and use.
 *
 * Usage  : char* strnsplit ( char* str, char* buffer, int position, int size );
 *
 * This source code is under GNU GPL v3 license, you can use or modify it but
 * please don't forget giving some credits to the author.
 *
 * by WarLocG
 */

#if defined (__GNUG__) || defined (__cplusplus)
#include <iostream.h>
#include <cstring.h> /* strlen() */
#else
#include <stdio.h>
#include <string.h> /* strlen() */
#endif

#ifndef __BUFFER__
#define __BUFFER__ 255
#endif

char* strnsplit(char* str, char* buffer, int start, int size);

extern char buffer[__BUFFER__]; /* can be imported from other source */

char* strnsplit(char* str, char* buffer, int start, int size){
  int i;

  /* stopping if
   *  - size encountered ; str="abc" size=2 result="ab" 
   *  - str length lesser than size ; str="abc" size=6 result="abc"
   *  - buffer overflow ; strlen(str) > BUFFER && size > BUFFER
   */
  for (i = 0; (i<__BUFFER__-1) && (i<size) && (i<strlen(str)); i++){
  	/*buffer[i] = str[start+i];*/
        *(buffer+i) = *(str+start+i); 
  }
  /*buffer[i] = 0; *//* caracter '\0' at end */
   *(buffer+i) = 0; 

  return buffer;
}

J'ai conservé les tableaux scalaires en commentaires pour ceux qui sont plus a l'aise avec des tableaux, mais c'est plus rapide de travailler avec des pointeurs.

Un fichier d'exemple pour le tester ici:

{ example.c }

[== C++ ==]
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h> /* isdigit(), atoi() */
#include "util.h" /* la lib a tester */

char buffer[__BUFFER__]; /* redefinissez une variable buffer comme suit pour utiliser la fonction */

int test(char* str){
  int i=0;

  while (*(str+i)){
    if (!isdigit(*(str+i))) return 0; /* sortir avec resultat faux si le caractere n est pas un numerique */
    i++;
  }
  return 1; /* resultat = vrai ; la chaine est composée exclusivement de caracteres numeriques */
}

int main(int argc, char* argv[]){
  if (argc != 4 || (!test(argv[2])) || (!test(argv[3]))){
    puts("Syntaxe: cmd string position taille");
    puts(" exemple: ./run abcdefghijklmnopqrstuvwxyz 13 8");
    exit(0);
  } else {
    printf("resultat : %s\n", 
      strnsplit(argv[1],buffer,atoi(argv[2]),atoi(argv[3]))
    );
  }
  return 0;
}

Compilation:

gcc -Wall -pedantic -o $votreexecutable example.c util.h

Test:

./$votreexecutable abcdef 2 4

Avant de poser vos questions, jeter un oeil ici
Mon CodeVault et Wiki : ici
Les messages privés envers le staff sont uniquement pour les cas d'urgence ou affaires privées (personnelles). Les demandes se feront exclusivement sur le forum. Merci de respecter cette clause sous peine de sanctions.

Hors ligne

#2 17-01-2014 18:40:19

IceF0x
#! Gourou Linux

Re : petite fonction de decoupe de chaine en C - strnsplit()

Et la réponse du test donne quoi ?


Utiliser des logiciels propriétaires, c'est comme les plats préparés, on est incapable de dire les conservateurs qu'ils contiennent, on dira toujours que c'est bon, mais ça ne remplacera jamais le repas fait maison par sa maman.
]:D #! Crunchbang & Archlinux GNU/Linux User ]:D

Hors ligne

#3 17-01-2014 19:23:22

WarLocG
#! modo de compet

Re : petite fonction de decoupe de chaine en C - strnsplit()

Pour les curieux ou les personnes qui auraient quand même des doutes wink

1389979368.png


Avant de poser vos questions, jeter un oeil ici
Mon CodeVault et Wiki : ici
Les messages privés envers le staff sont uniquement pour les cas d'urgence ou affaires privées (personnelles). Les demandes se feront exclusivement sur le forum. Merci de respecter cette clause sous peine de sanctions.

Hors ligne

Pied de page des forums