Transformer un "string" en 'char'

Résolu/Fermé
Killraider Messages postés 65 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 25 mai 2016 - 5 avril 2013 à 17:48
Killraider Messages postés 65 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 25 mai 2016 - 7 avril 2013 à 18:46
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

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
5 avril 2013 à 20:40
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
Killraider Messages postés 65 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 25 mai 2016 2
6 avril 2013 à 15:50
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];
}


}
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
6 avril 2013 à 16:07
// 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.
0
Killraider Messages postés 65 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 25 mai 2016 2
6 avril 2013 à 16:22
formidable !!!
CA MARCHE!!

Merci beaucoup!!

je ne ferme pas encore le sujet au cas où j'aurais d'autres questions sur ces instructions.
0
Killraider Messages postés 65 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 25 mai 2016 2
6 avril 2013 à 16:44
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]|
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
6 avril 2013 à 18:42
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.
0

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

Posez votre question
Killraider Messages postés 65 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 25 mai 2016 2
6 avril 2013 à 21:31
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.
0
Killraider Messages postés 65 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 25 mai 2016 2
6 avril 2013 à 21:33
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.
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
6 avril 2013 à 22:01
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.
0
Killraider Messages postés 65 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 25 mai 2016 2
6 avril 2013 à 21:35
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
0
Killraider Messages postés 65 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 25 mai 2016 2
7 avril 2013 à 18:46
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
0