BONJOUR
tu pourrais ne pas utiliser find, et à la place boucler sur le tableau de char.
Au fur et à mesure tu concatènes ta string de sortie avec le caractère ou sa majuscule.
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
PS pour tes prochains posts, merci de faire comme décidé là https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code
Bonjour lili200016,
Voici pour ton programme un exemple qui fonctionne sous Windows.
#include <windows.h> #include <iostream> #include <string> #include <cstddef> std::string print(const std::string tab) { char* buf = new char[tab.size()+1]; CharToOemA(tab.c_str(), buf); std::string str(buf); delete [] buf; return str; } int main () { std::string mot; std::cout << print("Entrez un mot de plus de 10 caractères : "); std::cin >> mot; std::cout << print("Entrez la lettre à rechercher: "); char lettre; std::cin >> lettre; std::size_t found = mot.find_first_of(lettre); std::cout << "La lettre " << lettre << print(" apparaît aux positions : "); while (found!=std::string::npos) { std::cout << found+1 << " "; mot[found] = toupper(lettre); found = mot.find_first_of(lettre, found+1); } std::cout << std::endl << print("Le mot modifié : "); std::cout << mot << std::endl; return 0; }
On peut en faire des variantes. Bien cordialement, pgl10
Bonjour,
attention le type retourné par std::string::find() n'est pas int, c'est std::string::size_type et s'il n'est pas trouvé la valeur n'est pas -1, c'est std::string::npos. Ton code peut marcher, mais ça n'est pas garanti.
Pour convertir en majuscule, il faut juste convertir le caractère et tu connais sa position. Il suffit d'insérer entre les lignes 25 et 26:
mot[i] = toupper( static_cast<unsigned char>(mot[i]) );
Voir la doc de toupper() pour comprendre pourquoi il faut faire un cast du caractère en unsigned char.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionBonjour Dalfab,
Merci de rappeler que le prototype de la fonction toupper() est : int toupper(int c)
Pour cela, je propose la variante suivante.
#include <windows.h> #include <iostream> #include <cstddef> #include <string> std::string print(const std::string tab) { char* buf = new char[tab.size()+1]; CharToOemA(tab.c_str(), buf); std::string str(buf); delete [] buf; return str; } int main () { std::string mot; std::cout << print("Entrez un mot de plusieurs caractères : "); std::cin >> mot; char lettre; std::cout << print("Entrez la lettre à rechercher : "); std::cin >> lettre; int code = static_cast<int>(lettre); while (code < 97 || code > 122) { std::cout << "Il faut une minuscule, recommencez : "; std::cin >> lettre; code = static_cast<int>(lettre); } std::size_t found = mot.find_first_of(lettre); std::cout << "La lettre " << lettre << print(" apparaît aux positions : "); while (found != std::string::npos) { std::cout << found+1 << " "; mot[found] = toupper(lettre); found = mot.find_first_of(lettre, found+1); } std::cout << std::endl << print("Le mot modifié : "); std::cout << mot << std::endl; return 0; }
Voici deux commentaires au sujet de l'instruction : mot[found] = toupper(lettre);
1°) La variable lettre de type char est convertie implicitement en type int. Et sa valeur est comprise entre 97 et 122.
2°) La page https://cplusplus.com/reference/string/string/find_first_of/ montre que le type std::size_t et le type std::string::size_type sont identiques. Et sa valeur ne peut pas être std::string::npos à cet endroit.
Bien cordialement, pgl10
Bonjour tous,
Avec le code source ci-joint la variable mot, de type std::string, qui est lue avec l'instruction : std::cin >> mot; comporte nécessairement une suite de caractères sans aucun caractère <espace>. Mais si on souhaite aussi pouvoir lire dans la variable mot une phrase qui comporte plusieurs mots séparés avec le caractère <espace> c'est très facile : il suffit de remplacer l'instruction : std::cin >> mot; par l'instruction : std::getline (std::cin, mot);
De plus, avec un contrôle différent dans l'instruction : while (code < 97 || code > 122) la lettre donnée par l'utilisateur pourrait aussi être l'un des caractères suivants : àáâãäåæçèéêëìíîïðñòóôõöùúûüý qui ont une majuscule dans la liste des codes ASCII de 0 à 255.