Chercher un élément dans un tableau de string [Résolu]

Signaler
Messages postés
20
Date d'inscription
lundi 14 décembre 2020
Statut
Membre
Dernière intervention
19 février 2021
-
Messages postés
542
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
11 avril 2021
-
#include <iostream>
#include <string>
#include <windows.h>
#include <vector>
#include <map>
#include <stdio.h>
#include <string.h>
using namespace std;

void question(char tab)
{
    cout << tab;
    Sleep(50);    
}

int main()
{
    string animal[] = { "chat","chien" };
    string vehicule[] = { "voiture","moto" };

    int tail = sizeof(animal);
    int tim = 0;
    while (tim < tail)
    {
     char cherche[tail];                 //creation du tableau de char valent la taille int du tableau animal valent 2 string chat et chien   (probleme lexpression doit avoir une valeur de constante)
     string copy = animal[tim];          //copy tableau de string animal[0] dans un string copy  sa OK;
     char cherche[] = copy;              //copy string copy dans tableau de char cherche  (initialisation inatendu avec l'objet dagregation)
    
     char* res;
     res = strstr(apprendre, cherche);   //apprendre cin >> string     aucune instance de fonction surcharger "strstr"
    }

19 réponses

Messages postés
20
Date d'inscription
lundi 14 décembre 2020
Statut
Membre
Dernière intervention
19 février 2021

problème résolut pour la fonction strstr() elle accepte que des char ou tableau de char
donc je convertie mon string en tableau de char et mon tableau de string en tableau de char encore un problème a la compilation.

string apprendre;
    cout << "Pose moi ta question ? ";
    getline(cin, apprendre);
           
    cout << apprendre;

    string animal[] = { "chat","chien" };
    string vehicule[] = { "voiture","moto" };

    string nomenclature = animal[0];           //donc nomenclature = chat

    const int tail2 = sizeof(nomenclature);     //tail2 = taille du string chat
    char mot[tail2];                                 //le tableau mot[] prend en taille la const tail2

    const int tail3 = sizeof(apprendre);     //idem pour le text entré par lutilisateur
    char text[tail3];

    int temp = 0;                                            //une premiere boucle pour le mot
    while (temp < tail2)
    {
        mot[temp] = nomenclature[temp];
        cout << mot[temp];
        temp = temp + 1;
    }
    // je n'ai pas fait la 2eme boucle pour le text cin sa beug
    cout << "la suite du progragam";
    char* resultat;
    resultat = strstr(text, mot);
}
Messages postés
3838
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 février 2021
119
Bonjour.

Si tu fais du C++, évite de mettre du C partout. Soit tu fais du C, soit tu fais du C++. Le mélange des deux, ce n'est pas conseillé.
Vu que tu as l'air de vouloir faire du C++, reste dessus. Donc utilise des std::string et non des char*.
Pour chercher un mot dans un string, utilise la méthode "find", tout simplement.

Exemples:

Chercher une sous chaine dans une chaine:
std::string str = "There are two needles in this haystack with needles.";
std::string str2 = "needle";

std::size_t found = str.find(str2);
if (found != std::string::npos)
  std::cout << "first 'needle' found at: " << found << '\n';


Chercher un élément dans un tableau d'entier:
std::vector<int> myvector = {1, 2, 3, 4};
auto it = find(myvector.begin(), myvector.end(), 3);
if (it != myvector.end())
  std::cout << "Element found in myvector: " << *it << '\n';
else
  std::cout << "Element not found in myvector\n";


Chercher un élément dans un tableau de string:
std::vector<std::string> myvector = {"pomme", "poire", "banane", "fraise"};
auto it = find(myvector.begin(), myvector.end(), "banane");
if (it != myvector.end())
  std::cout << "Element found in myvector: " << *it << '\n';
else
  std::cout << "Element not found in myvector\n";


Il faut vraiment que tu commences à lire la documentation du C++ ! Tout est dedans !
Ici: http://www.cplusplus.com/reference/

Et par exemple aussi ces liens là en particulier:
http://www.cplusplus.com/reference/string/string/find/
http://www.cplusplus.com/reference/algorithm/find/

Quelques conseils:
  • Evite les "using namespace std", c'est assez sale, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace/
  • Les balises de code pour du C++ sont "code cpp" et non "code csharp".
  • Utilise std::vector, std::map, std::array, std::unique_pointer, std::shared_ptr, etc... Et oublie les char[], char*, etc...
  • Ne mets pas "windows.h" dans tes headers, ça ne sert à rien, mais tu empêches les gens qui ne sont pas sous windows, de compiler ton code (et donc de t'aider).
Messages postés
20
Date d'inscription
lundi 14 décembre 2020
Statut
Membre
Dernière intervention
19 février 2021

merci pour tes réponse je pense que mon problème vient du sizeof(apprendre) au lieu de strlen car sa me renvoi une valeur binaire dans le int et si j'essaye de l'additionner sa ne fonctionne pas le problème c'est que strlen ne prend que des tableaux de char donc au moment du while temp < tail2binaire et le temp +1 il y a un débordement dans la taille peu être je préfère le C au c++ c'est pour sa

    const int tail3 = sizeof(apprendre);     //idem pour le text entré par lutilisateur
    char text[tail3];

    int temp = 0;                                            //une premiere boucle pour le mot
    while (temp < tail2)
    {
        mot[temp] = nomenclature[temp];
        cout << mot[temp];
        temp = temp + 1;
    }
Messages postés
3838
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 février 2021
119
Ton problème vient du fait que tu passes par des char[] et char*, alors que tu n'en a pas besoin. Utilise la bonne manière, c'est-à-dire des std::string et des std::vector, et tes problèmes seront résolus.
La réponse à ce que tu veux réaliser, est littéralement dans mon précédent post...
Sizeof ne donne pas la longueur d'une liste, mais sa taille (son empreinte mémoire, si tu préfères).

Si tu veux faire du C, fais du C ! Utilise un compilateur de C, et ne fais pas du tout de C++. Si tu mélanges les deux, tu vas avoir beaucoup, beaucoup de problèmes. Le problème ce n'est pas le C ou le C++, les deux sont biens. C'est le mélange des deux qui pose souci. Si tu t'obstines à les mélanger, tu vas continuellement avoir des soucis d'adaptation de l'un à l'autre...
Messages postés
20
Date d'inscription
lundi 14 décembre 2020
Statut
Membre
Dernière intervention
19 février 2021

c'est bien sa oui ta solution fonctionne a merveille mais j'ai résolut mon problème au niveau de mon code source je voulais le faire fonctionner de cette manière et eviter les
debut begin() et fin end() j'ai bien identifier le pourquoi tout venais de cette fonction sizeof() qui renvoi la taille en octets au lieu de cette fonction size() qui renvoi le nombre de caractère dans un int sizeof(string) 26 octet --- size(string) nombre de caractères 4 mon while beugé forcément je te remercie.
Messages postés
20
Date d'inscription
lundi 14 décembre 2020
Statut
Membre
Dernière intervention
19 février 2021

le problème c'est que je n'identifie pas bien les différences entre le c et le c++ donc je me mélange forcément sa appelle a acheter les tomes en C mais j'hésite je fait les boutiques en ce moment.
Messages postés
20
Date d'inscription
lundi 14 décembre 2020
Statut
Membre
Dernière intervention
19 février 2021

voila j'ai recrée mon erreur pour bien la comprendre si tu compile sa marche




    string nomenclature = animal[0];
    int taill = size(nomenclature);                           //size()  renvoit un int  ok
    

    cout << taill;                                                       //je verifie la valeur  4
    taill = taill + 5;                                                    //je verifie si c'est bien un int j'additionne
    cout << taill;                                                       // 9
    
    char mot[50];

    int temp = 0;
    while (temp < taill)                                            //est voila mon beug 9 loop
    {
       
        mot[temp] = nomenclature[temp];           //pour un mot nomenclature de  4 donc débordement de tampon en enlevant l'addition tout fonctionne a merveille
        cout << mot[temp];
        temp = temp + 1;
       
    }

Messages postés
3838
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 février 2021
119
Voici comment chercher un mot dans une liste.

En C:
#include <stdio.h>
#include <string.h>

#define LIST_SIZE 2

int main()
{
  int i = 0;
  char word[256];
  const char* animal[LIST_SIZE] = { "chat", "chien" };

  scanf("%s", word);
  for (i = 0; i < LIST_SIZE; ++i)
  {
    if (strcmp(word, animal[i]) == 0)
    {
      printf("Trouvé %s\n", word);
    }
  }

  return 0;
}


En C++:
#include <iostream>
#include <vector>

int main()
{
  std::string word;
  std::vector<std::string> animal = { "chat", "chien" };

  std::cin >> word;
  for (auto s : animal)
  {
    if (word == s)
    {
      std::cout <<  "Trouvé " << word << std::endl;
    }
  }

  return 0;
}


Au sujet du choix du langage:
Le C est "bas niveau", c'est-à-dire qu'il y a moins d'aide et d'automatisme qu'en C++. Tu n'auras pas de classe, de polymorphisme, de template, ou de pointeurs automatique dans ce langage. Ça ne veut pas dire que tu pourras faire moins de choses, juste que ça demandera plus de travail. Il te faudra aussi une très bonne compréhension de la gestion de la mémoire, vu qu'elle n'est pas automatisée.
Le C++ est plus "complet", mais il y a aussi plus de notions à apprendre. Il n'est pas nécessaire de tout gérer à la main comme en C, surtout avec les tableaux et les chaînes de caractères.

Si ces langages te sont imposés, où si c'est toi qui a choisi de les utiliser, dans ce cas part là dessus. En revanche, si tu es débutant, et que tu ne sais pas quel langage utiliser pour commencer et que tu as le choix, ne part pas là dessus. Utilise plutôt du Golang (ça ressemble à du C). C'est un langage plus moderne (Golang: création 2009, C/C++ création 1970/1980) et plus simple à prendre en main.
Messages postés
20
Date d'inscription
lundi 14 décembre 2020
Statut
Membre
Dernière intervention
19 février 2021

une question toute bête que j'ai passé des heures pourquoi cela ne fonctionne pas que avec des macros ? alors que dans les autres language comme le php cela fonctione

int num= 256;
char word[num];
Messages postés
542
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
11 avril 2021
4
Bonjour,

Encore une confusion entre le C et le C++.
En C, ça fonctionne. Ça s'appelle les VLA.
En C++, ça fonctionne aussi si on utilise les tableaux du C++ et pas ceux du C.
int num= 256;
std::vector<char> word(num);
Messages postés
3838
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 février 2021
119
C'est parce que le C, n'est ni du C++, ni du PHP. Ce n'est pas parce quelque chose fonctionne dans un langage, qu'il s'écrira de la même manière dans un autre.

En C classique on ne peut mettre qu'une valeur constante en taille de tableau.
typedef NUM 256 // 0K dans toutes les versions du C
const int num = 256; // OK à partir de C99
int num = 256; // Interdit
char word[num];


En C99 et en C++, on peut mettre une taille dynamique. Généralement, en C++, on passe par des std::string ou des std::vector, donc la question ne se pose pas. En C, on passe par des malloc/free, donc ce n'est pas très important non plus.

En C++, on fait ceci:
std::string word = "toto";


En C, on fait cela, pour obtenir le même résultat:
int num = 256;
char* word = malloc(num * sizeof(char));
word[0] = 't';
word[1] = 'o';
word[2] = 't';
word[3] = 'o';
word[4] = '\0';
free(word);
Messages postés
20
Date d'inscription
lundi 14 décembre 2020
Statut
Membre
Dernière intervention
19 février 2021

en détaille


#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
    vector<string> animal = { "chat" };    //marche pas
    const int taill = size(animal[0]);     //const prend la valeur vide d'une variable et beug a la modification cest pas possible  avant que le compilateur li la ligne  9  il initialise la ligne 10 en const int en valeur vide  ? sa beug je sais pas
    char tab[taill]; 



    const int  num = 4;                    // ca marche
    char mot[num];
}

Messages postés
3838
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 février 2021
119
N'utilise pas "using namespace".

Ceci fonctionne:
std::vector<std::string> animal = { "chat" };

Il faut bien que tu aies l'option -std=c++11 d'activé dans tes options. Sinon, tu utiliseras une vieille version du C++ qui ne peut pas faire ça.
Messages postés
20
Date d'inscription
lundi 14 décembre 2020
Statut
Membre
Dernière intervention
19 février 2021

débat clos je te remercie pour ton attention oui je confond donc sa peut pas marcher je vais acheter les bouquins dès que je peux en c
Messages postés
20
Date d'inscription
lundi 14 décembre 2020
Statut
Membre
Dernière intervention
19 février 2021

voila ou je voulais en venir j'ai recrée la fonction strstr();





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

using namespace std;

void fonction(char text_c[], char mot_c[])
{
    int text_initialisation = 0;
    int timer1 = 0 ;
    int timer2 = 0 ;
    int timer3 = 0;
    int timer4 = 0;
    char tab_text[1000];
    char tab_mot[100];
   

    string text_string = text_c;
    string mot_string = mot_c;

    const int x = text_string.length();
    const int y = mot_string.length();

    while (timer1 < x)
    {
        tab_text[timer1] = text_string[timer1];
       
        timer1 = timer1 + 1;

        if (timer1 == x)
        {
            int drop_text = x;
            drop_text = drop_text + 1;
            tab_text[drop_text] = '\0';
         
        }
      
    }

    while (timer2 < y)
    {
        tab_mot[timer2] = mot_string[timer2];
        
        timer2 = timer2 + 1;

        if (timer2 == y)
        {
            int drop_mot = y;
            drop_mot = drop_mot + 1;
            tab_mot[drop_mot] = '\0';
            
        }
       
    }



    while (tab_text[timer4] != '\0')
    {
        
        
        
        if (tab_mot[text_initialisation] != tab_text[timer3])
        {
            timer3 = timer3 + 1;
            if (text_initialisation > 0)
            {
                text_initialisation = text_initialisation - 1;
            }
        }
        else
        {
            text_initialisation = text_initialisation + 1;
            timer3 = timer3 + 1;
        }
        timer4 = timer4 + 1;
        

        if (text_initialisation == y)
        {
            cout << "VOUS AVEZ TROUVER UN MOT DANS VOTRE CHAINE DE CHAR LALGORYMTHE : " << text_initialisation << "  " << "EST EGAL A LA TAILLE :" << tab_mot ;
        }
        
    }


}




int main()
{
    
    char a[] = "chhikhchatkjt";    //text a rentrer
    char b[] = "chat";             //mot a trouver
    
    fonction(a, b);


}

Messages postés
20
Date d'inscription
lundi 14 décembre 2020
Statut
Membre
Dernière intervention
19 février 2021

Voila grace a ta fonction vector<char> version pro du code nikel et sans bavure !!!



#include <iostream>
#include <string>
#include <vector>
using namespace std;


void fonction(string a, string b)
{
    
    int timer = 0;
    int timer2 = 0;
    int timer3 = 0;
    int timer4 = 0;

    string textstring = a;
    string motstring = b;

    int taille_text = size(textstring);
    int taille_mot = size(motstring);

    vector<char>text(taille_text);
    vector<char>mot(taille_mot);
   

    while (timer < taille_text)
    {
        text[timer] = textstring[timer];
        cout << text[timer];
        timer = timer + 1;
    }

    cout << endl;

    while (timer2 < taille_mot)
    {
        mot[timer2] = motstring[timer2];
        cout << mot[timer2];
        timer2 = timer2 + 1;
    }
    
    cout << endl;



    int compteurdebits = 0;
    while (timer4 < taille_text)
    {
       

        if (mot[compteurdebits] == text[timer3])
        {    
           
            timer3 = timer3 + 1;
            compteurdebits = compteurdebits + 1;
                                                        
        }                                                       
        else
        {      
            timer3 = timer3 + 1;                               // donne moi une valeur je corige ma variable petit a petit je ne suis pas une machine j'apprend
            if (compteurdebits > 0)                            //meduse sans erreur text_initialisation = 0
            {                                                  //l'erreur humaine donne une concience a oui je nai pas vu le mot chat trop pres                   
                compteurdebits = compteurdebits - 1;            
            }
        }
        if (compteurdebits == taille_mot)
        {
            cout << "Jai trouver le mot : " << motstring << " dans ta phrase : " << textstring << endl;
            compteurdebits = 0;
        }
        
       
        timer4 = timer4 + 1;
       
    }

}




int main()
{
   
    string a = "la phrase a chercher le mot chat oui la phrase";       //vous pouvez choisir char a[] = "nfekjrzhgekj";
    string b = "chat";                                                 //vous pouvez choisir char b[] = "nfekjrzhgekj";
    fonction(a, b);


}


Messages postés
3838
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 février 2021
119
version pro du code nikel et sans bavure !!!

Pas vraiment pro, il y a pas mal de soucis...
  • Using namespace (beurk)
  • Copie des strings en arguments
  • Copie des strings en tableau de char (pourquoi ?)
  • Tout un tas de vérifications peu utiles
  • Fonction très longue, alors que ça tient en 8-10 lignes
  • Ecriture sur la sortie standard dans la fonction (ce n'est pas son rôle).


S'il fallait écrire cette fonction proprement deux solutions: soit tu utilises "find" qui fait déjà cela, soit tu recodes ça comme ceci:
#include <iostream>
#include <string>

int mystrstr(const std::string& stack, const std::string& needle)
{
  const int stackSize = stack.size();
  const int needleSize = needle.size();
  const int shiftSize = stack.size() - needle.size() + 1;

  for (int shift = 0; shift < shiftSize; ++shift)
  {
    int i = 0;
    while (i + shift < stackSize && i < needleSize && stack[i + shift] == needle[i])
    {
      ++i;
    }
    if (i >= needleSize)
    {
      return shift;
    }
  }

  return -1;
}

int main()
{
  std::string a = "la phrase a chercher le mot chat oui la phrase";
  std::string b = "chat";

  int pos = mystrstr(a, b);
  if (pos >= 0)
  {
    std::cout << "J'ai trouvé le mot: \"" << b
              << "\" dans la phrase: \"" << a << "\""
              << " à la position " << pos
              << std::endl;
  }
  else
  {
    std::cout << "Pas trouvé :(" << std::endl;
  }

  return 0;
}
Messages postés
20
Date d'inscription
lundi 14 décembre 2020
Statut
Membre
Dernière intervention
19 février 2021

oui c'est différent avec du c++ pur et plus rapide c'est sur
Messages postés
542
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
11 avril 2021
4
La fonction
strstr
existe en C++, c'est
std::search
:
int  mystrstr(std::string_view stack, std::string_view needle) {
    auto  it = std::search(stack.begin(), stack.end(),
            std::default_searcher(needle.begin(), needle.end()));
    if ( it == stack.end() )
        return  -1;
    else
        return  std::distance(stack.begin(), it);
}