Probleme de place en C

Résolu/Fermé
valgoku Messages postés 187 Date d'inscription lundi 17 avril 2006 Statut Membre Dernière intervention 22 janvier 2013 - 14 mars 2010 à 15:36
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 15 mars 2010 à 17:19
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'

7 réponses

valgoku Messages postés 187 Date d'inscription lundi 17 avril 2006 Statut Membre Dernière intervention 22 janvier 2013 47
14 mars 2010 à 15:49
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 ^^
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
14 mars 2010 à 16:09
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,
0
valgoku Messages postés 187 Date d'inscription lundi 17 avril 2006 Statut Membre Dernière intervention 22 janvier 2013 47
14 mars 2010 à 16:18
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....
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
14 mars 2010 à 16:44
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,
0

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

Posez votre question
valgoku Messages postés 187 Date d'inscription lundi 17 avril 2006 Statut Membre Dernière intervention 22 janvier 2013 47
15 mars 2010 à 14:54
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 !

@+++
0
valgoku Messages postés 187 Date d'inscription lundi 17 avril 2006 Statut Membre Dernière intervention 22 janvier 2013 47
15 mars 2010 à 14:57
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....
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
15 mars 2010 à 17:19
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
0