Probleme de place en C
Résolu
valgoku
Messages postés
213
Statut
Membre
-
fiddy Messages postés 11653 Statut Contributeur -
fiddy Messages postés 11653 Statut Contributeur -
Bonjour,
Voilà mon programme :
#include <stdio.h>
#include <stdlib.h>
#define NB_CHAR 6
void echange(char *caract1,char *caract2);
int main()
{
char caract[NB_CHAR];
int i=0;
int j=0;
int boo=1;
printf("Rentrez 7 lettres svp \n");
for(i=0;i<NB_CHAR;i++){
scanf("%s",&caract[i]);
}
//tri à bulles
i=0;
while ((i<NB_CHAR) && (boo==1)){
boo=0;
for(j=NB_CHAR-1;j>=0;j--){
if(caract[j-1] > caract[j]){
echange(&caract[j-1],&caract[j]);
boo=1;
}
}
i++;
}
printf("\n\n");
for(i=0;i<NB_CHAR;i++){
printf("%c\n",caract[i]);
}
return 0;
}
void echange(char *caract1,char *caract2){
char variableTEMP;
variableTEMP=*caract1;
*caract1=*caract2;
*caract2=variableTEMP;
}
Et voilà ce qu'il me dit à chaque fois :
Run-Time Check Failure #2 - Stack around the variable 'caract' was corrupted.
Pourquoi ????
Je respect bien le nombre de caractere, je ne sors donc pas du tableau...
Sous Code::Blocks je n'avais pas cette erreur et là sous Visual Studio je lé !
Donc je ne sais que faire !!
Pourriez vous m'aider svp ? Car cela fait planter un autre de mes programmes, marchant aussi sous CB.
Val'
Voilà mon programme :
#include <stdio.h>
#include <stdlib.h>
#define NB_CHAR 6
void echange(char *caract1,char *caract2);
int main()
{
char caract[NB_CHAR];
int i=0;
int j=0;
int boo=1;
printf("Rentrez 7 lettres svp \n");
for(i=0;i<NB_CHAR;i++){
scanf("%s",&caract[i]);
}
//tri à bulles
i=0;
while ((i<NB_CHAR) && (boo==1)){
boo=0;
for(j=NB_CHAR-1;j>=0;j--){
if(caract[j-1] > caract[j]){
echange(&caract[j-1],&caract[j]);
boo=1;
}
}
i++;
}
printf("\n\n");
for(i=0;i<NB_CHAR;i++){
printf("%c\n",caract[i]);
}
return 0;
}
void echange(char *caract1,char *caract2){
char variableTEMP;
variableTEMP=*caract1;
*caract1=*caract2;
*caract2=variableTEMP;
}
Et voilà ce qu'il me dit à chaque fois :
Run-Time Check Failure #2 - Stack around the variable 'caract' was corrupted.
Pourquoi ????
Je respect bien le nombre de caractere, je ne sors donc pas du tableau...
Sous Code::Blocks je n'avais pas cette erreur et là sous Visual Studio je lé !
Donc je ne sais que faire !!
Pourriez vous m'aider svp ? Car cela fait planter un autre de mes programmes, marchant aussi sous CB.
Val'
A voir également:
- Probleme de place en C
- [Arobase] à la place de @ - Forum MacOS
- Peut on aller en fosse avec une place assise - Forum Loisirs / Divertissements
- Simulation place accor hotel arena - Forum Loisirs / Divertissements
- Comment faire de la place sur gmail - Guide
- Concert place numérotée peut on allez dans la ✓ - Forum Loisirs / Divertissements
7 réponses
Avertissement 1 warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\users\valentin\documents\visual studio 2008\projects\tri a bulles\tri a bulles\main.cpp 15 tri a bulles
Il me marque ca en warning.
Quand je mets le scanf_s quand je veux afficher à la fin, rien ne s'affiche, mais au moins je n'ai plus le probleme que j'avais avant.
Sachant que je ne sais pas ce que le scanf_s fait ,je ne peux résoudre seul ce probleme...
HELP ^^
Il me marque ca en warning.
Quand je mets le scanf_s quand je veux afficher à la fin, rien ne s'affiche, mais au moins je n'ai plus le probleme que j'avais avant.
Sachant que je ne sais pas ce que le scanf_s fait ,je ne peux résoudre seul ce probleme...
HELP ^^
Bonjour,
Il y a un problème effectivement avec le scanf.
char caract[NB_CHAR];
printf("Rentrez 7 lettres svp \n");
for(i=0;i<NB_CHAR;i++){
scanf("%s",&caract[i]);
}
Tu mets "rentrez 7 lettres", mais il faut en rentrer 5 puisque NB_CHAR vaut 6.
Ensuite, le scanf est incorrect : scanf("%s",caract); tout simplement fera l'affaire.
Et enfin, scanf() sans contrôle sur la taille est effectivement unsafe. Par contre, scanf_s n'est pas portable, donc à ne pas utiliser. Je te conseillerais d'utiliser tout simplement scanf("%5s",caract); et de vérifier que la fonction renvoie bien 1.
Cdlt,
Il y a un problème effectivement avec le scanf.
char caract[NB_CHAR];
printf("Rentrez 7 lettres svp \n");
for(i=0;i<NB_CHAR;i++){
scanf("%s",&caract[i]);
}
Tu mets "rentrez 7 lettres", mais il faut en rentrer 5 puisque NB_CHAR vaut 6.
Ensuite, le scanf est incorrect : scanf("%s",caract); tout simplement fera l'affaire.
Et enfin, scanf() sans contrôle sur la taille est effectivement unsafe. Par contre, scanf_s n'est pas portable, donc à ne pas utiliser. Je te conseillerais d'utiliser tout simplement scanf("%5s",caract); et de vérifier que la fonction renvoie bien 1.
Cdlt,
Alors pour le nombre de caractères rentrés ne t'inquiète pas, je le connais car je le code, c'est juste que j'ai oublié de le changer. ^^
Ensuite scanf("%s",caract); peut marcher ? Car là, tu vas stocker le caractère de l'utilisateur mais où ??
Quand je fais ca, quand je veux réafficher, j'ai des signes bizarre....
Ensuite scanf("%s",caract); peut marcher ? Car là, tu vas stocker le caractère de l'utilisateur mais où ??
Quand je fais ca, quand je veux réafficher, j'ai des signes bizarre....
scanf("%s",caract); peut marcher ?
Bien sûr, et c'est comme ça qu'il faut faire. Mais scanf("%5s", caract) est beaucoup mieux.
Par contre, cette façon (scanf("%s",&caract[i]);) est incorrect.
caract. Ce serait bon si tu mettais "%c" pour stocker caractère par caractère.
Mais là tu veux une chaîne de caractères.
Donc à la place de
for(i=0;i<NB_CHAR;i++){
scanf("%s",&caract[i]);
}
il faut mettre tout simplement : scanf("%5s", caract).
Le premier caractère tapé ira dans caract[0], le second dans caract[1], etc jusqu'au dernier caractère.
Cdlt,
Bien sûr, et c'est comme ça qu'il faut faire. Mais scanf("%5s", caract) est beaucoup mieux.
Par contre, cette façon (scanf("%s",&caract[i]);) est incorrect.
caract. Ce serait bon si tu mettais "%c" pour stocker caractère par caractère.
Mais là tu veux une chaîne de caractères.
Donc à la place de
for(i=0;i<NB_CHAR;i++){
scanf("%s",&caract[i]);
}
il faut mettre tout simplement : scanf("%5s", caract).
Le premier caractère tapé ira dans caract[0], le second dans caract[1], etc jusqu'au dernier caractère.
Cdlt,
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
fiddy ! Merci pour tes conseils ! Et j'ai réussi à trouver mon erreur !!! :)
C'était aussi dans ma boucle ( oui car j'avais un pb de tri ^^). je mettais j != i alors que c'était j>i ^^
Merci à toi ! Ca fait plaisir d'avoir de l'aide ;)
Bonne journée !
@+++
C'était aussi dans ma boucle ( oui car j'avais un pb de tri ^^). je mettais j != i alors que c'était j>i ^^
Merci à toi ! Ca fait plaisir d'avoir de l'aide ;)
Bonne journée !
@+++
Par contre !!!!!!!!!!! ^^ J'ai toujours ce problème de waring sous Visual Studio ! Donc soit mon compilateur bug ! Soit JE SAIS PAS ^^ !
Sous Code blocks no pb ! Sous visual studio pb ! Donc allez savoir....
Sous Code blocks no pb ! Sous visual studio pb ! Donc allez savoir....
for(j=NB_CHAR-1;j>=0;j--){
if(caract[j-1] > caract[j]){
il y a aussi un autre problème. La condition de ta boucle va jusqu'à j = 0 inclu.
A la ligne d'après tu auras caract[-1] qui provoquera un segmentation fault.
Pour lavertissement sur scanf tu peux l'ignorer si tu as bien mis ce que je tai dit.
Mais effectivement scanf est une fonction très dangereuse si mal utilisée, ce qui represente une majorité des cas malheureusement.
Cdlt
if(caract[j-1] > caract[j]){
il y a aussi un autre problème. La condition de ta boucle va jusqu'à j = 0 inclu.
A la ligne d'après tu auras caract[-1] qui provoquera un segmentation fault.
Pour lavertissement sur scanf tu peux l'ignorer si tu as bien mis ce que je tai dit.
Mais effectivement scanf est une fonction très dangereuse si mal utilisée, ce qui represente une majorité des cas malheureusement.
Cdlt