hi all, when i run the following cod it ok but when sorting initial student name it shows me the run time error "access violation (segmentation fault) raised in your program" in DEVc++
please help me fix this error.
hi all, when i run the following cod it ok but when sorting initial student name it shows me the run time error "access violation (segmentation fault) raised in your program" in DEVc++
please help me fix this error.
Many people don't like downloading files, and it's much easier for us to spot your problems if we can actually see the code. In the future, please paste your code in code tags (as plain text, with proper indentation). It should look like this:
Code:#include<stdio.h> #include<conio.h> #include<stdlib.h> #include<string.h> #include<dos.h> struct stud { int rn,id,ph; char add[30],na[20],d[15],in[5]; struct stud *next; }*h= NULL ,*p,*q,*t; void add() { p = new stud; printf("\nEnter the Initials of Student : "); scanf("%s",&p->in); printf("\nEnter the Last Name of Student : "); scanf("%s",&p->na); printf("\nEnter the ID of Student : "); scanf("%d",&p->id); printf("\nEnter the Roll No. of Student : "); scanf("%d",&p->rn); printf("\nEnter the Ph No. of Student : "); scanf("%d",&p->ph); printf("\nEnter the Address of Student : "); scanf("%s",&p->add); printf("\nEnter the D.O.B. of Student(dd/mm/yyyy) : "); scanf("%s",&p->d); p->next=NULL; if(h==NULL) { h=p; } else { q=h; while(q->next!=NULL) q=q->next; q->next=p; } } void addAt(int r) { q=h; while(q->rn!=r || q==NULL) q=q->next; if(q->rn==r) { p =(stud *)malloc(sizeof(stud)); printf("\nEnter the Initials of Student : "); scanf("%s",&p->in); printf("\nEnter the Last Name of Student : "); scanf("%s",&p->na); printf("\nEnter the ID of Student : "); scanf("%d",&p->id); printf("\nEnter the Roll No. of Student : "); scanf("%d",&p->rn); printf("\nEnter the Ph No. of Student : "); scanf("%d",&p->ph); printf("\nEnter the Address of Student : "); scanf("%s",&p->add); printf("\nEnter the D.O.B. of Student(dd/mm/yyyy) : "); scanf("%s",&p->d); p->next=q->next; q->next=p; } else { printf("\n\nRecord Not Found."); } } void delAt(int r) { q=h; while((q->next)->rn!=r || q==NULL) q=q->next; if((q->next)->rn==r) { q->next=(q->next)->next; printf("\n\nRecord Deleted."); } else printf("\n\nRecord Not Found."); } void modAt(int id) { q=h; int ch; while(q->id!=id && q!=NULL) q=q->next; if(q->id==id) { printf("******* MODIFY *******\n1.Name Initials\n2.Last Name"); printf("\n3.Roll No.\n4.Phone\n5.Add\n6.D.O.B.:\nEnter choice: "); scanf("%d",&ch); switch(ch) { case 1 : printf("\n\nEnter the Initials of Student : "); scanf("%s",&q->in);break; case 2 : printf("\nEnter the Last Name of Student : "); scanf("%s",&q->na);break; case 3 : printf("\nEnter the Roll No. of Student : "); scanf("%d",&q->rn);break; case 4 : printf("\nEnter the Ph No. of Student : "); scanf("%d",&q->ph);break; case 5 : printf("\nEnter the Address of Student : "); scanf("%s",&q->add);break; case 6 : printf("\nEnter the D.O.B. of Student(dd/mm/yyyy) : "); scanf("%s",&q->d);break; } } else printf("\nRecord not Found."); } void search(char ni[5]) { int flag=0; q=h; while(q!=NULL) { if(stricmp(q->in,ni)==0) { flag=1; printf("\n\nInitals of Student : %s ",q->in); printf("\n\nLast Name of Student : %s ",q->na); printf("\n\nID of Student : %d ",q->id); printf("\n\nRoll No. of Student : %d",q->rn); printf("\n\nPh No. of Student : %d",q->ph); printf("\n\nAddress of Student : %s",q->add); printf("\n\nD.O.B. of Student : %s",q->d); printf("\n\n\n"); } q=q->next; } if(flag==0) printf("\n\nNo Match Found."); } void sort() { p=h; while(p!=NULL) { q=h; while(q!=NULL) { if(stricmp(q->in,(q->next)->in)>0) { strcpy(t->in,q->in); strcpy(t->na,q->na); t->id=q->id; t->rn=q->rn; t->ph=q->ph; strcpy(t->add,q->add); strcpy(t->d,q->d); strcpy(q->in,(q->next)->in); strcpy(q->na,(q->next)->na); q->id= (q->next)->id; q->rn= (q->next)->rn; q->ph= (q->next)->ph; strcpy(q->add,(q->next)->add); strcpy(q->d,(q->next)->d); strcpy((q->next)->in,t->in); strcpy((q->next)->na,t->na); (q->next)->id = t->id; (q->next)->rn = t->rn; (q->next)->ph = t->ph; strcpy((q->next)->add,t->add); strcpy((q->next)->d,t->d); } q=q->next; } p=p->next; } } void disp() { p=h; while(p!=NULL) { printf("\nInitals of Student : %s ",p->in); printf("\nName of Student : %s ",p->na); printf("\nID of Student : %d ",p->id); printf("\nRoll No. of Student : %d",p->rn); printf("\nPh No. of Student : %d",p->ph); printf("\nAddress of Student : %s",p->add); printf("\nD.O.B. of Student : %s",p->d); printf("\n\n"); p=p->next; } } main() { int ch=0,r; char ni[5]; while(ch!=8) { printf("1.Add the Record.\n\n2.Add Record at Locn.\n\n3.Delete Record."); printf("\n\n4.Modify Record.\n\n5.Search Record.\n\n6.Sort Records."); printf("\n\n7.Display\n\n8.Exit"); printf("\n\nEnter the Choice: "); scanf("%d",&ch); switch(ch) { case 1: add(); break; case 2: printf("\nEnter the Roll No. : "); scanf("%d",&r); addAt(r); break; case 3: printf("\nEnter the Roll No. : "); scanf("%d",&r); delAt(r); break; case 4: printf("\nEnter the ID : "); scanf("%d",&r); modAt(r); break; case 5: printf("\nEnter the Initials : "); scanf("%s",&ni); search(ni); break; case 6: sort( ); printf("\n\nSorted"); break; case 7: disp(); break; } getch(); } getch(); }Those lines are Windows-specific. conio.h and dos.h are very outdated. Since you're barely using them, remove them. Also, you can use getchar(), which is more portable, in place of getch().Code:#include<conio.h> ... #include<dos.h> ... getch();
After I made that fix, I compiled your program:
I don't know how you are getting a seg fault, this doesn't even compile. If it compiles for you, you need to turn up the warnings on your compiler, or better yet, get a more current compiler (Dev-C++ is outdated and no longer supported).Code:$ make stud gcc -Wall -Werror -ggdb3 -std=c99 -pedantic -lm -lpthread stud.c -o stud stud.c: In function ‘add’: stud.c:16:9: error: ‘new’ undeclared (first use in this function) stud.c:16:9: note: each undeclared identifier is reported only once for each function it appears in stud.c:16:13: error: expected ‘;’ before ‘stud’ stud.c:18:5: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[5]’ [-Werror=format] stud.c:20:5: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[20]’ [-Werror=format] stud.c:28:5: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[30]’ [-Werror=format] stud.c:30:5: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[15]’ [-Werror=format] stud.c: In function ‘addAt’: stud.c:54:13: error: ‘stud’ undeclared (first use in this function) stud.c:54:19: error: expected expression before ‘)’ token stud.c:56:9: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[5]’ [-Werror=format] stud.c:58:9: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[20]’ [-Werror=format] stud.c:66:9: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[30]’ [-Werror=format] stud.c:68:9: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[15]’ [-Werror=format] stud.c: In function ‘modAt’: stud.c:110:23: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[5]’ [-Werror=format] stud.c:112:23: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[20]’ [-Werror=format] stud.c:118:23: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[30]’ [-Werror=format] stud.c:120:23: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[15]’ [-Werror=format] stud.c: In function ‘search’: stud.c:134:9: error: implicit declaration of function ‘stricmp’ [-Werror=implicit-function-declaration] stud.c: At top level: stud.c:211:1: error: return type defaults to ‘int’ [-Werror] stud.c: In function ‘main’: stud.c:250:17: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[5]’ [-Werror=format] cc1: all warnings being treated as errors make: *** [stud] Error 1
As for the problems
- Line 16: You need to pick a language and stick to it. Your code is 99% C, so I would just use C. 'new' is a C++ operator. In C you can use malloc, which is roughly equivalent (you do this on line 54). Also, you must give the full type: struct stud. stud, on it's own, does not exist.
- All the "error: format ‘%s’ expects" errors are because you don't need the & when using an array with scanf. The name of the array (e.g. p->add) is already a pointer to the first element, so adding the & is wrong.
- Line 134: This is not a standard function, maybe it is provided by conio.h or dos.h, I don't know because I don't have those headers. You could write your own very easily however.
- Line 211: You should declare main to explicitly return an int, and then actually return one at the end (see below).
There may be more, but that is plenty for you to work on for now. When you get that finished, and if you still have this seg fault you can't find, then you can come back here for more help. If/when you do so, please provide your updated code along with whatever input causes the seg fault, so we can help you debug.Code:int main(void) { ... return 0; }
Last edited by anduril462; 11-07-2012 at 01:12 PM.
One more thing, read this link: Global Variables Are Bad. Declare all your variables in the appropriate functions and pass them around as needed. Globals, in this case, probably hurt more than they help. Also, h, p, q and t are horrible names, as are the struct members rn, , ph, na, d and in. Use descriptive names, like head, tail, temp, phone, etc. That will help us (and you) identify the purpose of the variable, so we can know whether you're using the variable correctly.
anduril462 i did what you said but the same error appears the code is about student database which contains the student initial name, last name, id, roll no., phone no., address and bate of birth of student all things is ok but when i select the chice no 6 sort records according to initial name the error appears.
i think the error in the sort function and what is the good compiler.
thanks in advance.
Please give new source code, and provide actual input, not just a description of the fields you want. It may be that the names you pick, your birthday format, etc is causing the bug. Don't make me guess at how to replicate this. I can probably find the seg fault in 2 min if you provide the info I asked for.
EDIT: As for compilers, I really like GCC, which is the default for most Linux distributions. A Windows port is also available (called MinGW), and comes with Code::Blocks, an IDE. Another Windows alternative is Pelles C, and even MS Visual C++ has a free version that compiles C code.
Last edited by anduril462; 11-08-2012 at 12:50 PM.
insertCode:#include<stdio.h> #include<conio.h> #include<stdlib.h> #include<string.h> #include<dos.h> struct stud { int rn,id,ph; char add[30],na[20],d[15],in[5]; struct stud *next; }*h= NULL ,*p,*q,*t; void add() { p =(struct stud *)malloc(sizeof(stud)); printf("\nEnter the Initials of Student : "); scanf("%s",p->in); printf("\nEnter the Last Name of Student : "); scanf("%s",p->na); printf("\nEnter the ID of Student : "); scanf("%d",&p->id); printf("\nEnter the Roll No. of Student : "); scanf("%d",&p->rn); printf("\nEnter the Ph No. of Student : "); scanf("%d",&p->ph); printf("\nEnter the Address of Student : "); scanf("%s",p->add); printf("\nEnter the D.O.B. of Student(dd/mm/yyyy) : "); scanf("%s",p->d); p->next=NULL; if(h==NULL) { h=p; } else { q=h; while(q->next!=NULL) q=q->next; q->next=p; } } void addAt(int r) { q=h; while(q->rn!=r || q==NULL) q=q->next; if(q->rn==r) { p =(struct stud *)malloc(sizeof(stud)); printf("\nEnter the Initials of Student : "); scanf("%s",p->in); printf("\nEnter the Last Name of Student : "); scanf("%s",p->na); printf("\nEnter the ID of Student : "); scanf("%d",&p->id); printf("\nEnter the Roll No. of Student : "); scanf("%d",&p->rn); printf("\nEnter the Ph No. of Student : "); scanf("%d",&p->ph); printf("\nEnter the Address of Student : "); scanf("%s",p->add); printf("\nEnter the D.O.B. of Student(dd/mm/yyyy) : "); scanf("%s",p->d); p->next=q->next; q->next=p; } else { printf("\n\nRecord Not Found."); } } void delAt(int r) { q=h; while((q->next)->rn!=r || q==NULL) q=q->next; if((q->next)->rn==r) { q->next=(q->next)->next; printf("\n\nRecord Deleted."); } else printf("\n\nRecord Not Found."); } void modAt(int id) { q=h; int ch; while(q->id!=id && q!=NULL) q=q->next; if(q->id==id) { printf("******* MODIFY *******\n1.Name Initials\n2.Last Name"); printf("\n3.Roll No.\n4.Phone\n5.Add\n6.D.O.B.:\nEnter choice: "); scanf("%d",&ch); switch(ch) { case 1 : printf("\n\nEnter the Initials of Student : "); scanf("%s",q->in);break; case 2 : printf("\nEnter the Last Name of Student : "); scanf("%s",q->na);break; case 3 : printf("\nEnter the Roll No. of Student : "); scanf("%d",&q->rn);break; case 4 : printf("\nEnter the Ph No. of Student : "); scanf("%d",&q->ph);break; case 5 : printf("\nEnter the Address of Student : "); scanf("%s",q->add);break; case 6 : printf("\nEnter the D.O.B. of Student(dd/mm/yyyy) : "); scanf("%s",q->d);break; } } else printf("\nRecord not Found."); } void search(char ni[5]) { int flag=0; q=h; while(q!=NULL) { if(stricmp(q->in,ni)==0) { flag=1; printf("\n\nInitals of Student : %s ",q->in); printf("\n\nLast Name of Student : %s ",q->na); printf("\n\nID of Student : %d ",q->id); printf("\n\nRoll No. of Student : %d",q->rn); printf("\n\nPh No. of Student : %d",q->ph); printf("\n\nAddress of Student : %s",q->add); printf("\n\nD.O.B. of Student : %s",q->d); printf("\n\n\n"); } q=q->next; } if(flag==0) printf("\n\nNo Match Found."); } void sort() { p=h; while(p!=NULL) { q=h; while(q!=NULL) { if(stricmp(q->in,(q->next)->in)>0) { strcpy(t->in,q->in); strcpy(t->na,q->na); t->id=q->id; t->rn=q->rn; t->ph=q->ph; strcpy(t->add,q->add); strcpy(t->d,q->d); strcpy(q->in,(q->next)->in); strcpy(q->na,(q->next)->na); q->id= (q->next)->id; q->rn= (q->next)->rn; q->ph= (q->next)->ph; strcpy(q->add,(q->next)->add); strcpy(q->d,(q->next)->d); strcpy((q->next)->in,t->in); strcpy((q->next)->na,t->na); (q->next)->id = t->id; (q->next)->rn = t->rn; (q->next)->ph = t->ph; strcpy((q->next)->add,t->add); strcpy((q->next)->d,t->d); } q=q->next; } p=p->next; } } void disp() { p=h; while(p!=NULL) { printf("\nInitals of Student : %s ",p->in); printf("\nName of Student : %s ",p->na); printf("\nID of Student : %d ",p->id); printf("\nRoll No. of Student : %d",p->rn); printf("\nPh No. of Student : %d",p->ph); printf("\nAddress of Student : %s",p->add); printf("\nD.O.B. of Student : %s",p->d); printf("\n\n"); p=p->next; } } int main(void) { int ch=0,r; char ni[5]; while(ch!=8) { printf("1.Add the Record.\n\n2.Add Record at Locn.\n\n3.Delete Record."); printf("\n\n4.Modify Record.\n\n5.Search Record.\n\n6.Sort Records."); printf("\n\n7.Display\n\n8.Exit"); printf("\n\nEnter the Choice: "); scanf("%d",&ch); switch(ch) { case 1: add(); break; case 2: printf("\nEnter the Roll No. : "); scanf("%d",&r); addAt(r); break; case 3: printf("\nEnter the Roll No. : "); scanf("%d",&r); delAt(r); break; case 4: printf("\nEnter the ID : "); scanf("%d",&r); modAt(r); break; case 5: printf("\nEnter the Initials : "); scanf("%s",ni); search(ni); break; case 6: sort( ); printf("\n\nSorted"); break; case 7: disp(); break; } getchar(); } getchar(); return 0; }
i enter data as following
m
s
1
1
124
4214
29/12/1983
then
a
s
2
2
234
3245
2/8/1980
then choose choice no. 6 sort records and the error appears
Okay, you fixed most of the problems I mentioned, but your code still doesn't compile. If it can't compile, then you can't have the same problem (seg fault when running it). Here's the error messages I get when compiling:
Your malloc calls are still broken. The compiler doesn't know what 'stud' is. It knows what 'struct stud' is. Also, you shouldn't be casting malloc (read this link). There is a better way:Code:$ make stud gcc -Wall -Werror -ggdb3 -std=c99 -pedantic -lm -lpthread -lefence stud.c -o stud stud.c: In function ‘add’: stud.c:16:37: error: ‘stud’ undeclared (first use in this function) stud.c:16:37: note: each undeclared identifier is reported only once for each function it appears in stud.c: In function ‘addAt’: stud.c:54:41: error: ‘stud’ undeclared (first use in this function) stud.c: In function ‘search’: stud.c:134:9: error: implicit declaration of function ‘stricmp’ [-Werror=implicit-function-declaration] cc1: all warnings being treated as errors make: *** [stud] Error 1
That way, whatever type of pointer p is, this malloc call will always allocate the correct size, the size of *p, which is the size of whatever type of object p points to.Code:p = malloc(sizeof(*p));
Now, you need to tell me exactly what input you give the program to cause this seg fault. The best way is to copy-paste what shows up on your terminal or in Dev-C++ when you run the program. Like this (I removed unnecessary blank lines to keep this short):
Notice the lines in red, how the program continued without me actually entering input. You have problems with how you are reading input, you have "dangling newlines". The user presses enter at the end of a line of input, and this puts a '\n' into the input stream, which is being picked up by your input routines. This is usually due to mixing character (getchar, scanf("%c")), line (fgets) and formatted input (scanf other than "%c"). Read this link for more info: http://cboard.cprogramming.com/c-pro...ml#post1126782.Code:$ ./stud 1.Add the Record. 2.Add Record at Locn. 3.Delete Record. 4.Modify Record. 5.Search Record. 6.Sort Records. 7.Display 8.Exit Enter the Choice: 1 Enter the Initials of Student : A Enter the Last Name of Student : Anderson Enter the ID of Student : 111 Enter the Roll No. of Student : 42 Enter the Ph No. of Student : 1234567890 Enter the Address of Student : 987 any st Enter the D.O.B. of Student(dd/mm/yyyy) : 1.Add the Record. 2.Add Record at Locn. 3.Delete Record. 4.Modify Record. 5.Search Record. 6.Sort Records. 7.Display 8.Exit Enter the Choice: Enter the Initials of Student : Enter the Last Name of Student : Balmer Enter the ID of Student : 222
My recommendation is to read every single piece of input as a line with fgets, then parse out the number/DOB/name as the appropriate type with sscanf. Note, that first 's' means it scans a string (the string fgets read into) for the formatted input. This link shows the basic way to read a line with fgets: FAQ > Get a line of text from the user/keyboard (C) - Cprogramming.com.
anyone can help me the code compile ok but when run and enter data then choose sort records the error appears
Last edited by Mohamed Sadek; 11-08-2012 at 01:50 PM.
It appears that you've gone full circle here.
anduril462 gave you some more fixes, and asked some questions. Start with that.
then the segmentation error appears anyone can help meCode:1.Add the Record. 2.Add Record at Locn. 3.Delete Record. 4.Modify Record. 5.Search Record. 6.Sort Records. 7.Display 8.Exit Enter the Choice: 1 Enter the Initials of Student : m Enter the Last Name of Student : s Enter the ID of Student : 1 Enter the Roll No. of Student : 1 Enter the Ph No. of Student : 21321 Enter the Address of Student : 213 Enter the D.O.B. of Student(dd/mm/yyyy) : 29/12/1983 1.Add the Record. 2.Add Record at Locn. 3.Delete Record. 4.Modify Record. 5.Search Record. 6.Sort Records. 7.Display 8.Exit Enter the Choice: 1 Enter the Initials of Student : a Enter the Last Name of Student : s Enter the ID of Student : 2 Enter the Roll No. of Student : 2 Enter the Ph No. of Student : 23 Enter the Address of Student : 432 Enter the D.O.B. of Student(dd/mm/yyyy) : 2/8/1980 1.Add the Record. 2.Add Record at Locn. 3.Delete Record. 4.Modify Record. 5.Search Record. 6.Sort Records. 7.Display 8.Exit Enter the Choice: 6
Has your code changed from what you provided in post #6?
- If so, please provide new code so I can actually debug the same code as you have. Don't make me ask this again.
- If not, why have you not incorporated the changes I suggested? Some of them are "mandatory", some are merely "strong suggestions". Either way, you should implement them all.