Erreur de segmentation C++

Résolu/Fermé
Piven Messages postés 81 Date d'inscription lundi 7 septembre 2009 Statut Membre Dernière intervention 27 février 2012 - 16 déc. 2009 à 00:16
Piven Messages postés 81 Date d'inscription lundi 7 septembre 2009 Statut Membre Dernière intervention 27 février 2012 - 17 déc. 2009 à 21:12
Bonjour,
Voila un petit bout de code, le but est de faire un switch pour appliquer du code en fonction d'une entrée de l'utilisateur. Voila le code,qui a l'execution m'envoie un erreur de segmentation juste après la saisie de l'utilisateur, I hope you can help me!J'ai aussi quelques Warning au niveau de la déclaration de la table de test.

char* tab_test[22]= {"carre", "Carre", "CARRE", "carré", "Carré","Rectangle", "rectangle", "RECTANGLE", "réctangle", "Réctangle", "Triangle", "triangle","TRIANGLE","arc de cercle", "Arc de cercle","Arc De Cercle", "ARC DE CERCLE", "segment","Segment","ségment","Ségment","SEGMENT"};
int s_(char* str)
{
for(int i=1;i<23;i++)
if (strcmp(str,tab_test[i])==0)
return i;
return 0;
}
void Objet_Composite::ajouter_un_elts(){
char* type;
cout<<"Quelque type d'élément voulez vous ajouter?"<<endl;
cin>>type;
//nb_elts++;
cout<<"hello";
int id = s_(type);
switch(id){
case 1:
case 2:
case 3:
case 4:
case 5://carre*/
cout<<"carre";
break;
case 6:
case 7:
case 8:
case 9:
case 10://rectangle
cout<<"rectangle";
break;
case 11:
case 12:
case 13://triangle
cout<<"triangle";
break;
case 14:
case 15:
case 16:
case 17://arc de cercle
cout<<"arc de cercle";
break;
case 18:
case 19:
case 20:
case 21:
case 22://segment
cout<<"segment";
break;
default:
cout<<"pas trouvé";
break;
}
}

5 réponses

Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
16 déc. 2009 à 00:35
for(int i=1;i<23;i++)
if (strcmp(str,tab_test[i])==0)
return i;
return 0;
}


attention les tableaux commencent à l'indice [0] et le tien finis à [21] dans ton cas puisqu'il y a 22 éléments.

Donc quand tu essayes d'accéder au [22] comme ton code le permet, il y a erreur de ségmentation normalement.
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
16 déc. 2009 à 19:30
Depuis que j'ai lu ce post, ça me titille; le coup du débordement d'indice qui donne un 'segment fault', je n'en suis pas sûr dans la mesure où l'on écrit rien (sauf si on déborde de la page allouée, selon le système d'exploitation). Toutefois il est certain que c'est une grosse erreur.
Ce qui me gêne le plus est:
char* type;
cin>>type;

Là on est quasi certain d'obtenir un 'segment fault'.
L'exercice, quelque peu simplifié pourrait ainsi s'écrire:
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;

int main(int argc, char *argv[])
{
  const char* tab_test[5] = {"carre", "rectangle", "triangle", "arc de cercle", "segment" };
  char buffer[100];

  cout<<"Quel type d'élément voulez vous ajouter : " ;
  cin.get(buffer, 100);
  for (unsigned int i=0; i<strlen(buffer); i++)
    buffer[i] = tolower(buffer[i]);
  for (int i=0; i<5; i++)
    if (!strcmp(buffer, tab_test[i]))
    {
      cout << "Type: " << tab_test[i] << " Ok." << endl;
      return (EXIT_FAILURE);
    }
    
  cout << "Type incorrect." << endl;
  return (EXIT_SUCCESS);
Bonne continuation.
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
16 déc. 2009 à 22:25
ah oui, c'est évident, c'est une erreur "grave" qui cause sans doute le message d'erreur merci de l'avoir remarqué! :)
0
Piven Messages postés 81 Date d'inscription lundi 7 septembre 2009 Statut Membre Dernière intervention 27 février 2012 3
16 déc. 2009 à 23:41
"buffer[i] = tolower(buffer[i]);" Ne gère pas les "é" mais ça réduit tout de même les possibilités. Merci de ton aide, mais après avoir résolut se problème de manière différente(C'était a priorie du cin>>char* donc j'ai limité la taille a 50), Je suis tombé sur une autre ERREUR DE SEGMENTATION... Dût un problème de Polymorphisme... Je travail encore dessus. Mais ça fait chauffer les neurones!
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
17 déc. 2009 à 00:07
Sors dehors, ils vont refroidir !
L'utilisation de la fonction 'cin' pour saisir les chaînes de caractères est toujours dangereux car elle ne gère pas la taille saisie; malgré tout il est possible de saisir une chaîne de caractères car en C++ il existe les strings, et là il n'y a pas de problème.
Ne gère pas les "é"
Je sais et c'est la raison pour laquelle, j'ai précisé 'quelque peu simplifié'.
Bonne continuation.
0
Piven Messages postés 81 Date d'inscription lundi 7 septembre 2009 Statut Membre Dernière intervention 27 février 2012 3
17 déc. 2009 à 15:56
Le soucis avec les string c'est que je ne sais pas si il existe la surcharge du "==". Alors que je sais me servir de strcmp(char*,char*).
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
17 déc. 2009 à 16:41
pas de souci avec std::string et == ; s'il y avait un problème le compilo te le dirai.
0

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

Posez votre question
Piven Messages postés 81 Date d'inscription lundi 7 septembre 2009 Statut Membre Dernière intervention 27 février 2012 3
17 déc. 2009 à 21:12
C'est vrai que ça aurais etait plus simple. Mais bon maintenant c'est fait ;)
0