Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Xin cho hỏi về lỗi này trong C

  1. #1
    Ngày gia nhập
    07 2008
    Bài viết
    4

    Mặc định Xin cho hỏi về lỗi này trong C

    Mình là beginner,Mong mọi người giải đáp giùm !!
    Sau khi code xong bài này chạy thử thì thấy báo lỗi sau, Tại sao báo lỗi và cách giải quyết?
    Mong mọi người giải đáp giùm !! THANK !!

    Code:
    BEGINER caused a General Protection Fault in module BEGINNER.EXE at 0001:05B6.
    Choose close.BEGINNER will close.
    Đây là code của mình:
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<string.h>
    #define max 100
    typedef struct sinhvien
    {	char hoten[30];
    	char maso[6];
    };
    typedef struct danhsachsv
    {	short tssv;
    	sinhvien sv[max];
     };
    void nhap_ds(danhsachsv *psv)
    {
    char sosv[4];
    printf("Ban muon nhap bao nhieu sinh vien:");
    	gets(sosv);
    	psv->tssv=atoi(sosv);
    		for(short i=0;i<psv->tssv;i++)
            	{
    	  		printf("Ma so:");
    	  		gets(psv->sv[i].maso) ;
    	  		printf("Ho ten:");
    	  		gets(psv->sv[i].hoten);
            	}
     }
    void  lietke_ds(danhsachsv *psv)
    {
    short i=0;
    clrscr();
    printf("Ma so	|	Ho va ten\n");
      	while(i<psv->tssv)
      	{
        		printf("%s	|	%-s\n",psv->sv[i].maso,psv->sv[i].hoten);
        		i++;
      	}
    	getch();
    }	           
    short timkiem(danhsachsv *psv,char maso[])
    {
    short i;
    while(i<psv->tssv&&(strcmp(psv->sv[i].maso,maso)!=0))
    	i++;
    	return(i==psv->tssv?-1:i);
    
    }
    void main()
    {
    danhsachsv ts;
    char maso[6];
    short vitri;
    	nhap_ds(&ts);
    	lietke_ds(&ts);
    		printf("Nhap ma so sinh vien ban muon tim:")    ;
    		gets(maso);
    		vitri=timkiem(&ts,maso);
    		if(vitri!=-1)
    			printf("Sinh vien ban can tim la:%s",ts.sv[vitri].hoten);
    			else
    			printf("ko co nguoi ban tim");
    		getch();
    }

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mình đã sửa. Lưu ý là mã số chỉ được nhập từ 5 ký tự trở xuống thôi.

    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<string.h>
    4. #define max 100
    5.  
    6. typedef struct sinhvien
    7. {
    8.     char hoten[30];
    9.     char maso[6];
    10. };
    11.  
    12. typedef struct danhsachsv
    13. {
    14.     int tssv;
    15.     sinhvien sv[max];
    16. };
    17.  
    18. void nhap_ds(danhsachsv *psv)
    19. {
    20.     int sosv;
    21.  
    22.     printf("Ban muon nhap bao nhieu sinh vien:");
    23.     scanf("%d",&sosv);
    24.  
    25.     psv->tssv=sosv;
    26.     for(int i=0;i<psv->tssv;i++)
    27.     {
    28.         fflush(stdin);
    29.         printf("Ma so:");
    30.         gets(psv->sv[i].maso) ;
    31.         printf("Ho ten:");
    32.         gets(psv->sv[i].hoten);
    33.     }
    34. }
    35.  
    36. void lietke_ds(danhsachsv *psv)
    37. {
    38.     short i=0;
    39.  
    40.     clrscr();
    41.     printf("Ma so   |   Ho va ten\n");
    42.     while(i<psv->tssv)
    43.     {
    44.         printf("%s  |   %-s\n",psv->sv[i].maso,psv->sv[i].hoten);
    45.         i++;
    46.     }
    47.  
    48.     getch();
    49. }
    50.  
    51. int timkiem(danhsachsv *psv,char maso[])
    52. {
    53.     int i=0; // lỗi lớn nhất là chưa gán biến i = 0
    54.     while( i<(psv->tssv) && (strcmp(psv->sv[i].maso,maso) != 0))
    55.         i++;
    56.  
    57.     return(i==psv->tssv?-1:i);
    58. }
    59.  
    60. void main()
    61. {
    62.     danhsachsv ts;
    63.     char maso[6];
    64.     int vitri;
    65.  
    66.     nhap_ds(&ts);
    67.     lietke_ds(&ts);
    68.     printf("Nhap ma so sinh vien ban muon tim:")    ;
    69.     gets(maso);
    70.     vitri = timkiem(&ts,maso);
    71.  
    72.     if(vitri!=-1)
    73.         printf("Sinh vien ban can tim la:%s",ts.sv[vitri].hoten);
    74.     else
    75.         printf("ko co nguoi ban tim");
    76.  
    77.     getch();
    78. }
    Đã được chỉnh sửa lần cuối bởi meoconlongvang : 12-10-2008 lúc 01:02 AM.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    07 2008
    Bài viết
    4

    Cho mình hỏi thêm về fflush(stdin); được không?
    Mình chưa hiểu hàm này có chức năng gì? còn nữa: lỗi mình đã nêu ở trên là lỗi gì?
    Code:
    BEGINER caused a General Protection Fault in module BEGINNER.EXE at 0001:05B6.
    Choose close.BEGINNER will close.
    Thank meocon nhiều!!
    Đã được chỉnh sửa lần cuối bởi playboy : 12-10-2008 lúc 12:38 AM.

  4. #4
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    fflush(std) để xóa vùng đệm bàn phím. Nếu sau khi xài hàm scanf mà ko xóa vùng đệm thì hàm gets sẽ không chạy đúng.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  5. #5
    Ngày gia nhập
    07 2008
    Bài viết
    4

    Mình hiểu rồi, cảm ơn meocon

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn