Erreur de segmentation en C
Résolu
rocksider
Messages postés
106
Date d'inscription
Statut
Membre
Dernière intervention
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
voilà j'ai esseyer de faire le programme qui fait le travaille de strcat, et apres l'avoir compiler quand je l'execute il m'affiche : Erreur de segmentation.
voilàa le code :
merci d'avance
voilà j'ai esseyer de faire le programme qui fait le travaille de strcat, et apres l'avoir compiler quand je l'execute il m'affiche : Erreur de segmentation.
voilàa le code :
#include<stdio.h> #include<string.h> char * strcati(char *,char *); main() { char s1,s2; printf("donner la valeur de s1: "); scanf("%s",&s1); printf("donner la valeur de s2: "); scanf("%s",&s2); strcati(&s1,&s2); printf("strcat donne : %s",s1); } char * strcati(char s1[],char s2[]) { char *ps1= s1+(strlen(s1)+1); char *ps2=s2; while(*ps1++=*ps2++) ; s2='\0'; return s1; }
merci d'avance
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 4201 france tv ✓ - Forum Réseaux sociaux
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- J'aime par erreur facebook notification - Forum Facebook
7 réponses
J'ai pas testé, mais ne serait-ce pas ton "while(*ps1++=*ps2++) ;" ?
Un simple égal n'est qu'une affectation, et pas un test d'égalité. Sur des pointeurs ça doit faire de la bonne bouilie dans ton cas lol. (en plus tant que l'affectation se fait bien, ça renvoi 1, et donc ça reste dans ta while)
Un simple égal n'est qu'une affectation, et pas un test d'égalité. Sur des pointeurs ça doit faire de la bonne bouilie dans ton cas lol. (en plus tant que l'affectation se fait bien, ça renvoi 1, et donc ça reste dans ta while)
rocksider
Messages postés
106
Date d'inscription
Statut
Membre
Dernière intervention
9
oui, il est fait expré le truc de l'affectation, normalement quand ps2++ = '\0' la boucle serait equivalente à while(0) et passerai au instruction suivantes,
bizu53
Messages postés
1274
Date d'inscription
Statut
Membre
Dernière intervention
861
>
rocksider
Messages postés
106
Date d'inscription
Statut
Membre
Dernière intervention
au temps pour moi, c'est vrai qu'une affectation de 0 renvoie 0.
Salut,
tu peux essayer ca:
autre chose, dans ta fonction initial tu mets une valeur de retour: char* et dans ta fonction main quand tu appelles ta fonction tu n'as pas:
s=strcati(s1, s2)://s etant un char*
si tu fais pas cela, tu n'a pas besoin de faire un return dans ta fonction....et tu fais un void strcati(char s1[],char s2[])
char * strcati(char s1[],char s2[])
{
char *ps1= s1+(strlen(s1)+1);
char *ps2=s2;
while(*ps1++=*ps2++) ;
s2='\0';
return s1;
}
L'erreur segment Fault c'est en général un probleme d'allocation mémoire..
et je t'avouerai que l'exe ne doit pas savoir à quelle adresse correspond cela:char *ps1= s1+(strlen(s1)+1);
A la rigueur:char *ps1=(char*)malloc((strlen(s1)+1)*sizeof(char));
J'espere ca pourra t'aider!!
@+
tu peux essayer ca:
#include<stdio.h> #include<string.h> void strcati(char *,char *); main() { char s1[255],s2[255]; printf("donner la valeur de s1: "); scanf("%s",&s1); printf("donner la valeur de s2: "); scanf("%s",&s2); strcati(s1,s2); printf("strcat donne : %s",s1); getchar(); } void strcati(char* s1,char* s2) {s1=s1+strlen(s1); int i=0; while(*s2!='\0') {*s1=*s2; s2++; s1++; i++; } s1=s1-(strlen(s1)+i-1); }
autre chose, dans ta fonction initial tu mets une valeur de retour: char* et dans ta fonction main quand tu appelles ta fonction tu n'as pas:
s=strcati(s1, s2)://s etant un char*
si tu fais pas cela, tu n'a pas besoin de faire un return dans ta fonction....et tu fais un void strcati(char s1[],char s2[])
char * strcati(char s1[],char s2[])
{
char *ps1= s1+(strlen(s1)+1);
char *ps2=s2;
while(*ps1++=*ps2++) ;
s2='\0';
return s1;
}
L'erreur segment Fault c'est en général un probleme d'allocation mémoire..
et je t'avouerai que l'exe ne doit pas savoir à quelle adresse correspond cela:char *ps1= s1+(strlen(s1)+1);
A la rigueur:char *ps1=(char*)malloc((strlen(s1)+1)*sizeof(char));
J'espere ca pourra t'aider!!
@+
Salut,
Il ne faut pas oublier qu'avec scanf on renvoie l'adresse. Donc dans le cas d'un tableau, il ne faut pas mettre l'esperluette. De plus, scanf n'est pas vraiment conseillé d'utilisation. Préférez-lui fgets par exemple.
Cdlt
Il ne faut pas oublier qu'avec scanf on renvoie l'adresse. Donc dans le cas d'un tableau, il ne faut pas mettre l'esperluette. De plus, scanf n'est pas vraiment conseillé d'utilisation. Préférez-lui fgets par exemple.
#include<stdio.h> #include<string.h> void strcati(char *,char *); int main(void){ char s1[100],s2[50]; printf("donner la valeur de s1: "); fgets(s1,sizeof(s1),stdin); printf("donner la valeur de s2: "); fgets(s2,sizeof(s2),stdin); strcati(s1,s2); printf("strcat donne : %s",s1); return 0; } void strcati(char s1[],char s2[]) { s1=s1+strlen(s1)-1; // -1 si tu veux enlever le \n obtenu lors de la saisi par l'utilisateur while(*s1++ = *s2++); *s1='\0'; }
Cdlt
merci a vous fiddy et chukka pour votre aide,merci beaucoup.
bah j'avait les erreurs suivante :
char s1 à la place de char s1[50],
et puis *char à la place de *void,
& devant un tableau dans scanf (meme si n'avait rien changer quand j'ai esseyé)
sinon pourquoi scanf n'est pas tres conseillé ?
bah j'avait les erreurs suivante :
char s1 à la place de char s1[50],
et puis *char à la place de *void,
& devant un tableau dans scanf (meme si n'avait rien changer quand j'ai esseyé)
sinon pourquoi scanf n'est pas tres conseillé ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Ah oui je me rapelle, il y'a une attaque dont j'ai oublié le nom qui permettait (je me rapelle plus bien ), en tout cas merci bcp :)
C'est vrai mais de toute façon cette attaque ne peut être que locale au programme de toute façon, donc il n'y a rien d'extraordinaire à faire avec...
Une autre solution tout en gardant le scanf() sans faire d'overflow est de jouer sur le formatage : scanf("%5s", str); qui prendra que 5 caractères même si plus sont saisis.
Personnellement ce n'est pas pour ce problème là que je n'utilise pas scanf() c'est pour les espaces pour les chaînes de caractères (séparation d'arguments avec scanf(), alors que gets() les prend comme ils le sont : des espaces).
Une autre solution tout en gardant le scanf() sans faire d'overflow est de jouer sur le formatage : scanf("%5s", str); qui prendra que 5 caractères même si plus sont saisis.
Personnellement ce n'est pas pour ce problème là que je n'utilise pas scanf() c'est pour les espaces pour les chaînes de caractères (séparation d'arguments avec scanf(), alors que gets() les prend comme ils le sont : des espaces).
Oui, mais fgets est quand même bien plus sécurisée. Enfin, le principal est de faire attention au débordement.
Après cette attaque n'est pas forcément locale si l'application développée est serveur.
Et tu dis peu d'intérêt ? J'espère que tu plaisantes, imagine que l'application a les droits setuid, tu te procures un shell sur la machine. Eh hop, élévation des privilèges. Pas pour rien, que les BoF sont d'actualités. Avec le nombre qui en sort par jours, et le fuzzing qui automatise le tout.
Cdlt
Après cette attaque n'est pas forcément locale si l'application développée est serveur.
Et tu dis peu d'intérêt ? J'espère que tu plaisantes, imagine que l'application a les droits setuid, tu te procures un shell sur la machine. Eh hop, élévation des privilèges. Pas pour rien, que les BoF sont d'actualités. Avec le nombre qui en sort par jours, et le fuzzing qui automatise le tout.
Cdlt