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
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
A voir également:
- Convertir string en char c++
- Convertir youtube en mp3 avec audacity - Guide
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Convertir epub en kindle - Guide
- Convertir trimestre en année ✓ - Forum Excel
- Convertir audio en texte word - Guide
8 réponses
ElementW
Messages postés
4816
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
5 octobre 2021
1 228
5 avril 2013 à 20:40
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).
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
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];
}
}
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];
}
}
ElementW
Messages postés
4816
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
5 octobre 2021
1 228
6 avril 2013 à 16:07
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.
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
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.
CA MARCHE!!
Merci beaucoup!!
je ne ferme pas encore le sujet au cas où j'aurais d'autres questions sur ces instructions.
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
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]|
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]|
ElementW
Messages postés
4816
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
5 octobre 2021
1 228
6 avril 2013 à 18:42
6 avril 2013 à 18:42
plan est un tableau: toutes ses valeurs sont alignées en mémoire. Tableau = pointer.
Vive les maths!
En utilisant ça et en adaptant la longueur à copier comme il faut, tu pourra parvenir à un résultat.
Vive les maths!
plan+10est 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.
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
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.
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.
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
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.
Si il est possible de l'utiliser sur un tableau à 2D ce serait parfait.
ElementW
Messages postés
4816
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
5 octobre 2021
1 228
6 avril 2013 à 22:01
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.
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.
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
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
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
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
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