begin process at 2012 05 29 05:06:19
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

Fonction substr en C


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Fonction substr en C

jeudi 7 juin 2007 à 12:51:58 | Fonction substr en C

julien_boss

Bonjour,
j'ai codé cette fonction, sensée être l'équivalent de string::substr(...) en C :

char * StrSub(const char *s, int pos, int len)
{
    char *ps = (char*)s;
    static char rs[256];
    char *prs = rs;
    int strLen = strlen(s);
   
    if(pos>=strLen || len==0) return NULL;
    ps+=pos;

    if(len==-1 || len>(strLen-pos)) len=strLen-pos;
   
    int i=0;
    while(i<len && *ps!='\0')
    {
        *prs=*ps;
        prs++; ps++;
        i++;
    }
    *prs='\0';
   
    return rs;
}

Elle semble marcher seulement elle présente des dysfonctionnement, exemple :

char *s="une phrase";
cout << StrSub(s, 0, 5) <<endl<<StrSub(s, 5, -1);

qui affichera deux fois "une p", au lieu de "une p" puis "hrase" .

Je ne comprends pas l'erreur, et comme je ne maitrise pas tout à fait les pointeurs, je demande à un oeil avisé de bien vouloir me dire où ca coince. Merci bcp
jeudi 7 juin 2007 à 14:00:57 | Re : Fonction substr en C

vicenzo

Membre Club
ce fonctionne ok en C si du fait

printf("%s\n",  StrSub(s, 0, 5);
printf("%s\n",  StrSub(s, 5, -1);

Mais pas en C++ du fait de ton buffer static dans ta fonction.....

jeudi 7 juin 2007 à 14:05:08 | Re : Fonction substr en C

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

Si le compilo fait :

StrSub(s, 5, -1)
StrSub(s, 0, 5)

puis s'occupe des stream, il afficherat deux fois la variable statique rs qui contiendrat ce qui aurat été affecté lors du dernier appel.

cout << StrSub(s, 0, 5) <<endl;
cout << StrSub(s, 5, -1);

Ca fait le même problème ?

jeudi 7 juin 2007 à 14:09:15 | Re : Fonction substr en C

BruNews

Administrateur CodeS-SourceS

Essaie ceci, devrait aller.

Retourne combien remplis dans *szdst sans compter le zero final.

DWORD StrSub(const char *s, DWORD pos, DWORD len, char *szdst)
{
  char *p = szdst;
  if(!len) goto subEXIT;
  if(pos) { 
    do {
      if(*s++ == 0) goto subEXIT;
    } while(--pos);
  }
  do {
    if((*p = *s) == 0) goto subEXIT;
    p++; s++;
  } while(--len);
subEXIT:
  *p = 0;
  return (p - szdst);
}

ciao...
BruNews, MVP VC++

jeudi 7 juin 2007 à 14:43:44 | Re : Fonction substr en C

coucou747

Administrateur CodeS-SourceS
Salut

A quoi servent ces gotos exactement ?

enfin sans les gotos, ca reste digeste, y a t'il une difference de vitesse ?

DWORD StrSub(const char *s, DWORD pos, DWORD len, char *szdst)
{
  char *p = szdst;
  if(!len) goto subEXIT;
  if(pos) { 
    do {
      if(*s++ == 0) {
  *p = 0;
  return (p - szdst);
}
    } while(--pos);
  }
  do {
    if((*p = *s) == 0) break;
    p++; s++;
  } while(--len);
  *p = 0;
  return (p - szdst);
}

histoire de rester en accord avec notre cher dijkstra...


une recherche sur exalead vous aurait peut-etre evite de poser cette question
In a dream, I saw me, drop dead...
U were there, U cried...
It was just a dream,
if I die, U won't cry, maybe, U'll be happy
jeudi 7 juin 2007 à 14:46:54 | Re : Fonction substr en C

BruNews

Administrateur CodeS-SourceS
à éviter de dupliquer du code, tu le sais puisque c''est ce que tu as fait.
En quoi est-ce plus 'digeste' ???

ciao...
BruNews, MVP VC++
jeudi 7 juin 2007 à 15:08:05 | Re : Fonction substr en C

julien_boss

Merci pour vos codes, ca m'a permis de voir mon erreur. Mais il n'y a pas un moyen de retourner directement une chaine statique, bien que j'ai du mal à en voir un ? :s
jeudi 7 juin 2007 à 15:11:32 | Re : Fonction substr en C

coucou747

Administrateur CodeS-SourceS
http://fr.wikipedia.org/wiki/Edsger_Dijkstra
A case against the GOTO statement.

apres, disons que je programme dans quelques langages d'une facon similaire (quand je le peux evidement), peut-etre pour pouvoir relire tout ce que je fais meme apres une pause de quelques mois sur un langage... Ainsi, je n'utilise pas goto, pas switch, ... je sais que ca ne fait pas souvent un code parfait, je demandais juste si pour goto, ca faisait gagner du temps d'execution, pour malgre les imprefections de mon travail, savoir ce que j'ai a gagner a le perfectionner... (ne pas dupliquer du code, c'est un bon argument, mais tu tapes un label, deux goto, je tapes un break; et deux lignes, donc malgre le fait d'avoir duplique du code, j'en ai ecrit autant)



une recherche sur exalead vous aurait peut-etre evite de poser cette question
In a dream, I saw me, drop dead...
U were there, U cried...
It was just a dream,
if I die, U won't cry, maybe, U'll be happy
jeudi 7 juin 2007 à 15:15:40 | Re : Fonction substr en C

BruNews

Administrateur CodeS-SourceS
Peu importe les lignes de C, ce qui est à comparer est l'asm généré par le compilo, je verrai en soirée.
Je ne pense pas qu'un simple label aussi causant que 'subEXIT' gênera la compréhension de la fonction même 10 ans plus tard.

ciao...
BruNews, MVP VC++
jeudi 7 juin 2007 à 15:18:19 | Re : Fonction substr en C

BruNews

Administrateur CodeS-SourceS
julien_boss > prends par habitude de ne jamais retourner une chaine ou autre tableau statique. L'appelant doit être responsable des params passés, ça garantit l'usage à long terme de la fonction.
Ex: longueur de ton buffer statique ira toujours ??? ben non.

ciao...
BruNews, MVP VC++

1 2

Cette discussion est classée dans : int, char, len, pos, strlen


Répondre à ce message

Sujets en rapport avec ce message

Création d'un client [ par tomalille ] Bonjour,je viens d'écrire ce code qui cré un client qui se connecte sur un serveur apache. A la compilation (sous visual C++) j'ai 5 erreurs, je ne co Url encoding [ par Lestat_2070 ] Bonjour à tous,Tout d'abord, j'espère que je ne me trompes pas de section, pour ce sujet. Ensuite, j'essaye de faire une fonction comparable à la fonc Error LNK2019 [ par issam000000 ] bonjour ,je suis débutant en programmation , je  arrive pas a résoudre cette erreur , quand je compile tout ce passe bien , 0 erreur 0 avertissement , probléme de déplacement d'une case a une autre dans un tableaux de type char* [ par mlikos ] Bonjour, est ce qq1 peut m'aider a résoudre ce problème : #include #include #include struct coordonnees { int x; int y; }; typedef struc Allocation dynamique tableau 2D : erreur de seg [ par noname001 ] Bonjour à tous, [^^happy13] j'aimerais faire appel à vos lumières concernant deux codes. Ils ont tous les deux pour but de créer un tableau 2D dynami convertsion int en unsigned char [ par avg ] Salut tout le monde j'ai une souci pour convertir un int en unsigned char[] voir le code c++ qui affiche l'erreur [code=cpp]int a=100; unsigned char Tableaux - Gestion dynamique de la mémoire [ par Smanyx ] Salut ! Je voudrais écrire un programme qui accepte des noms saisis au clavier et les amasse dans un tableau. Comme les noms sont entrés dans un bouc besoin d'aide sur un programme en C éxécutable mais qui se bloque au début " recherche et affichage de palindromes " [ par nirvanitta ] salut tous le monde Mon programme consiste a ouvrir un fichier et chercher tous les palindromes et les afficher avec leurs numéros de lignes et leurs Programmation C : 2 unsigned char dans 1 unsigned int. [ par romain60112 ] Bonjours a tous, J'ai un petit soucis pour stocker 2 unsigned char dans 1 unsigned int. Je dispose de : un tableau d'unsigned int : unsigned int con


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,296 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales