Transformer un "string" en 'char' [Résolu/Fermé]

Signaler
Messages postés
65
Date d'inscription
lundi 31 janvier 2011
Statut
Membre
Dernière intervention
25 mai 2016
-
Messages postés
65
Date d'inscription
lundi 31 janvier 2011
Statut
Membre
Dernière intervention
25 mai 2016
-
Bonjour,

Voilà mon problème:
Etant débutant, j'ai un tableau à une dimension de string:
string nom [20];

et un autre tableau à une dimension de char:
char plan [20];

imaginons que l'utilisateur ait entré dans la case 0 du tableau nom le mot
"bonjour".

Je voudrais que "bonjour" soit transformé en char afin de le placer dans ma case 0 du tableau plan.

C'est à dire par exemple que le 'b' soit placer dans plan[0], 'o' dans plan [1], 'n' dans plan [2] etc...


J'ai déjà effectué quelques recherches qui aboutissent vers des char* ou const char mais je n'arrive pas à comprendre son fonctionnement.

Merci

8 réponses

Messages postés
4761
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
23 octobre 2020
1 234
Un std::string est déjà un tableau de cartère: un tableau n'est donc pas nécessaire, à moins que tu ne veuille un tableau de chaines de caractère. Il te faut donc juste définir
string nom;
std::string dispose d'une fonction c_str() qui renvoie un pointeur vers un tableau de caractères correspondant. Pour copier 20 caractères de ce dernier, on peut utiliser memcpy:
memcpy(plan, nom.c_str(), std::min(nom.length(), 20));
J'ai utilisé std::min pour la longueur a copier, car si nom fait moins de 20 caractères, memcpy va copier au-delà de la mémoire que nom utilise, et donc copier je-ne-sais-quoi (parfois source de bugs/crashs).
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
65
Date d'inscription
lundi 31 janvier 2011
Statut
Membre
Dernière intervention
25 mai 2016
2
Merci pour ta réponse.
Je suis entrain de tester.

Code::Blocks me propose "memccpy" au lieu de "memcpy". J'ai cherché un peu et apparemment ces deux instructions sont les mêmes.

J'ai un autre problème:
> no matching function for call to 'min(std::basic_string<char>::size_type, int)'|

Je crois que c'est au niveau du min que ça ne va pas.

Voilà mon code au complet:

----------------------------------

#include <iostream>
#include <string.h>

using namespace std;

int main()
{

char plan [20];
string nom ="bonjour";

memcpy(plan[10], nom.c_str(), std::min (nom.length(),7));

for (int i=0; i<20;i++)
{
cout << plan[i];
}


}
Messages postés
4761
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
23 octobre 2020
1 234
// Remplace:
nom.length()
// Par:
(int)(nom.length())

Le problème est que le type std::basic_string<char>::size_type est différent selon le PC et compilateur utilisé, ce n'est pas toujours un int, or std::min prends deux int.
Messages postés
65
Date d'inscription
lundi 31 janvier 2011
Statut
Membre
Dernière intervention
25 mai 2016
2
formidable !!!
CA MARCHE!!

Merci beaucoup!!

je ne ferme pas encore le sujet au cas où j'aurais d'autres questions sur ces instructions.
Messages postés
65
Date d'inscription
lundi 31 janvier 2011
Statut
Membre
Dernière intervention
25 mai 2016
2
J'ai une autre question, il copie chaque caractères de bonjour dans mon tableau plan .
Serait-il possible de lui dire de copier les caractères à partir d'une case spécifique de mon tableau plan?


memcpy(plan[10], nom.c_str(), (int) (nom.length(),7));

quand je mets plan[10] par exemple, j'ai une erreur.

invalid conversion from 'char' to 'void*' [-fpermissive]|
Messages postés
4761
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
23 octobre 2020
1 234
plan est un tableau: toutes ses valeurs sont alignées en mémoire. Tableau = pointer.
Vive les maths!
plan+10
est un pointeur qui pointe vers le 11eme caractère: plan renvoie déjà vers le 1er.
En utilisant ça et en adaptant la longueur à copier comme il faut, tu pourra parvenir à un résultat.
memcpy(plan+10, nom.c_str()+10,
    std::max(0, std::min((int)(nom.length()-10), 20-10))
); 
J'ai aussi mis un std::max pour que la longueur à copier ne descende pas en dessous de 0 si la longueur de nom est en dessous de 10.
Messages postés
65
Date d'inscription
lundi 31 janvier 2011
Statut
Membre
Dernière intervention
25 mai 2016
2
Je te remercie encore pour ton aide. C'est ce dont j'avais besoin.

J'ai encore une autre question. Dans l'exemple ci dessus, les caractères de "bonjour" sont copiés dans un tableau à une dimension.

Est-il possible de les copier dans un tableau à deux dimensions?
J'ai essayé en mettant char plan[10][10]; mais le compilateur me renvoie une erreur?

En fait, le but de mon programme est de concevoir le plan d'une maison.
Pour cela, j'utilise un tableau plan à deux dimensions de char. L'utilisateur entre la position verticale, horizontale, la hauteur et la largeur de la pièce, elle se modélise sous forme de caractère '.' dans la console.

Mon programme étant presque fini, j'aimerais qu'une fois l'étape des dimensions passée, l'utilisateur entre le nom de la pièce (string) puis que celui ci s'affiche dans mon tableau à 2D de char.
Messages postés
65
Date d'inscription
lundi 31 janvier 2011
Statut
Membre
Dernière intervention
25 mai 2016
2
Je crois que je touche au but avec la méthode que tu m'as donné.
Si il est possible de l'utiliser sur un tableau à 2D ce serait parfait.
Messages postés
4761
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
23 octobre 2020
1 234
Malheureusement memcpy ne marchera que sur une ligne, si tu veux faire une colonne, il faut créer toi-même une boucle for (ou while) qui assignera une valeur à chaque case.
Cela est du au fait que 1 ligne est alignée en mémoire, mais pas forcément les différentes lignes elles-mêmes.
Messages postés
65
Date d'inscription
lundi 31 janvier 2011
Statut
Membre
Dernière intervention
25 mai 2016
2
Et je me suis rendu compte au dernier moment que je pouvais utiliser un tableau de string. Mais vu tout le temps que ça m'a pris je ne vais pas tout recommencer
Messages postés
65
Date d'inscription
lundi 31 janvier 2011
Statut
Membre
Dernière intervention
25 mai 2016
2
C'est bon j'ai trouvé.
Pour ceux que ça intéresse la réponse se trouve ici:

http://fr.wikibooks.org/wiki/Programmation_C%2B%2B_(d%C3%A9butant)/La_classe_string

Exemple 3 : analyse de chaînes