Erreur de segmentation C++
Résolu
Piven
Messages postés
81
Date d'inscription
Statut
Membre
Dernière intervention
-
Piven Messages postés 81 Date d'inscription Statut Membre Dernière intervention -
Piven Messages postés 81 Date d'inscription Statut Membre Dernière intervention -
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;
}
}
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;
}
}
A voir également:
- Erreur de segmentation en c
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
5 réponses
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.
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.
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:
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.
"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!
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.
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.
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*).
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question