Cherche une fonction pour manipuler une chaine de caractere

BertaNd Messages postés 9 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 17 août 2005 - 2 août 2005 à 23:15
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 3 août 2005 à 14:57
salut

je cherche une fonction qui me permettrait de prendre le premier
caractere d'une chaine et de le deplacer a la fin de cette meme chaine,

exemple "cppfrance -> ppfrancec"



j'ai cherché sur msdn, mais bon ! j'ai deja du mal quand c'est en francais !



merci !

10 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 août 2005 à 23:36
char c;
len = strlen(psz);
a = psz[0];
strcpy(psz, psz+1);
psz[len - 1] = c;

ciao...
BruNews, MVP VC++
0
meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007
2 août 2005 à 23:49
Salut,



BruNews a été vif... Ci-dessous néanmoins, une p'tite fonction et un
programme appelant celle-ci, permettant de déplacer 0 à n caractères.



#include <stdio.h>

#include <string.h>



int deplace_caractere(char* str1, char* str2, int nbcar)

{

char* ch;

int i 0, j 0;



if (!str1) return(1);

if (!str2) return(2);

if (nbcar > strlen(str1)) return(3);



for (i = nbcar; str1[i] != 0; i++)

str2[j++] = str1[i];

for (i = 0; str1[i] != 0 && i < nbcar; i++) str2[j++] = str1[i];

str2[j] = 0;

return(0);

}



int main(int argc, char** argv)

{

char str1[32], str2[32];



strcpy(str1, "cppfrance");

if (deplace_caractere(str1, (char*)&str2, 1) != 0)

fprintf(stderr, "Erreur de déplacement de caractères\n");

else

{

printf("str1 = %s\n", str1);

printf("str2 = %s\n", str2);

}

return(0);

}



Compilation : gcc -o deplace_car.exe deplace_car.c



Possibilité d'optimiser.



Ciao.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 août 2005 à 00:04
3 parcours c'est beaucoup, j'avais mis en 2 mais on va réduire en 1 seul.
Pas testé mais devrait aller.

void DeplaceCar(char *psz)
{
char *c, *d, a;
c = psz;
a = *c++; // ON RETIENT LE 1er CHAR
if(!a) return; // CHAINE VIDE, C'EST FINI
if(!*(c+1)) return; // 1 SEUL CHAR, C'EST FINI
d = psz;
while(*d = *c++) d++;
*d = a;
}

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 août 2005 à 00:13
OUPS oubli que c est déjà incrémenté:

void DeplaceCar(char *psz)
{
char *c, *d, a;
c = psz;
a = *c++; // ON RETIENT LE 1er CHAR
if(!a) return; // CHAINE VIDE, C'EST FINI
if(!*c) return; // 1 SEUL CHAR, C'EST FINI
d = psz;
while(*d = *c++) d++;
*d = a;
}

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BertaNd Messages postés 9 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 17 août 2005
3 août 2005 à 02:06
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

int iLengh, i, j;

char szTitreWnd[128], szNewWindName[128];

switch (msg)

{

case WM_TIMER:


GetWindowText(hwnd, szTitreWnd, 128);


iLengh = strlen(szTitreWnd);


for (i=1; i<=iLengh; i++)

{

j = i-1;


szNewWindName[j] = szTitreWnd[i];

}


szNewWindName[iLengh-1] = szTitreWnd[0];


SetWindowText(hwnd,szNewWindName);

break;



default:


return DefWindowProc(hwnd, msg, wParam, lParam);

break;

}

return 0;

}



Pourquoi faire compliqué quand on peut faire tout simple?

Merci de votre aide, mais j'aime pas rester sur un echec , alors j'ai concocté ca en m'inspirant de vos sources

C'est ce qu'il me fallait, mais bon, j'explique tres mal !

merci @+
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
3 août 2005 à 08:56
Je peux te proposer une solution en C++ (en 1 seule ligne de code) se
basant sur la fonction standard ROTATE (qui s'applique à n'importe quel
conteneur standard, par exemple std::string).



string chaine = "bonjour!";

rotate(chaine.begin(),chaine.begin()+1,chaine.end());

// ici chaine vaut "onjour!b"



Voila un bout de code d'exemple :


#include

#include

#include<string>

using namespace std;



int main()

{

// test #1

string chaine = "bonjour!";

rotate(chaine.begin(),chaine.begin()+1,chaine.end());

cout << chaine << endl;

// test #2

chaine = "!";

rotate(chaine.begin(),chaine.begin()+1,chaine.end());

cout << chaine << endl;

// test #3

chaine = "";

rotate(chaine.begin(),chaine.begin()+1,chaine.end());

cout << chaine << endl;

}


Cordialement,
Xterminhate.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 août 2005 à 10:12
mets
iLenght = GetWindowText(...); // qui donne direct la strlen, tu gagnes 1 parcours
et
szNewWindName[iLengh-1] = szTitreWnd[0];
en sortie de boucle risque de faire planter si iLenght == 0.

donc:
if(2 > (iLenght = GetWindowText(...)) break; // NE RIEN FAIRE

ciao...
BruNews, MVP VC++
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
3 août 2005 à 10:20
ben vi c'est un ROL,

mais c'est sur qu'on parle de chaine ici, ASCII ou UNICODE....



selon l'environnement ou les choix....



Bien vu pour la stl....


Sinon, un nouveau bravo pour BN notre optimiseur nationnal !

a par a faire de l'assmb, je vois pas trop quelle soluce propre serait moins couteuse



a moins peut etre de pouvoir faire comme l'algo si dessous



mémoriser la pos de start

si possible, ALLOUER un car de plus (a la fin)

copier le premier car et le car de fin de chaine

Desallouer le 1er car

retourner la nvelle chaine





et on a gagné la copie de la partie centrale...





ça en assmb ressemblera a un rouleau compresseur (pour les connaisseurs)

les protections mem en plus.


___________________________________________________________
Magicalement
Nono
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
3 août 2005 à 14:39
C possible alors ce que j'ai dit plus haut?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 août 2005 à 14:57
Si on doit chercher toutes les manières possibles d'occuper le processeur pour rien, on va y passer le week end.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous