Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: Lỗi của lệnh scanf

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

    Mặc định Lỗi của lệnh scanf

    Em co doan code sau:
    Code:
    typedef struct
       {
        char ho[20];
        char ten[10];
        double luong;
        int tuoi;
        char diachi[10];
       } hoso;
    
    void NhapDS(hoso a[30],int n)
      {
       int i;
       for (i=1;i<=n;i++)
         {
          printf("+ Nhuoi thu %d: \n",i);
          fflush(stdin);
    	  printf("   Ho :  ");gets(a[i].ho);
          printf("   Ten:  ");gets(a[i].ten);
          fflush(stdout);
          printf("   luong:  ");scanf("%lf",&a[i].luong);
          printf("   Tuoi:   ");scanf("%d",&a[i].tuoi);
          fflush(stdin);
          printf("   Dia chi: ");gets(a[i].diachi);
          printf("\n\n");
    Sau khi nhập ten xong thi chương trình tắt,
    Sau khi chay từng bước thì phát hiện ra lỗi ở câu lệnh:


    Code:
    scanf("%lf",&a[i].luong);
    Mà không thể hiểu lý do vì sao lại sai.
    Mong các anh em trợ giúp.

    Note: Khi post bài bạn vui lòng cho code vào tag code {#} dùm.
    Đã được chỉnh sửa lần cuối bởi comeonbaby : 12-02-2008 lúc 06:03 PM.

  2. #2
    Ngày gia nhập
    11 2007
    Bài viết
    153

    Trước tiên có lẽ đoạn này có lỗi:
    Code:
      printf("   Ho :  ");gets(a[i].ho);// thiếu lệnh xóa bộ đệm cụ thể là fflush(stdin) vì khi nhập vào thì còn lưu lại ký tự enter trong bộ đệm bàn phím.
          printf("   Ten:  ");gets(a[i].ten);
          fflush(stdout);// stdout là sao nhỉ hình như mình không biết lệnh này?? có lẽ là stdin thì đúng hơn.
    Còn ở đây mình không nhớ là có lf mà chỉ có ld thôi thì phải?long double chứ không phải là long float.Mà bạn khai kiểu của luong là dobule chứ có phải là lf đâu nhỉ?
    Code:
    scanf("%lf",&a[i].luong);
    Đoạn tpedef bạn không để tên ở trên để chuyển về tên hoso mà nó vẫn nhận à lạ nhỉ mình chưa thử bao giờ.


    Bạn hãy test thử đi vì mình không có trình biên dịch ở máy nên không thể kiểm tra được nếu có thắc mắc gì cứ post câu hỏi lên mình sẽ cố gắng giải đáp trong phạm vi có thể.
    Đã được chỉnh sửa lần cuối bởi comeonbaby : 12-02-2008 lúc 06:17 PM.
    ttecak ?

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Lỗi gì, sao bạn không ghi ra, ghi hàm main ra xem ?

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    fflush(stdout);// stdout là sao nhỉ hình như mình không biết lệnh này?? có lẽ là stdin thì đúng hơn.
    stdout : standard output file.
    2 thằng này giống nhau nè baby.
    printf(...) <-> fprintf(stdout, ..);

  5. #5
    Ngày gia nhập
    11 2007
    Bài viết
    153

    À uh hoá ra là thế nhưng mà R này thế cái stdout thì dùng cho fprint chứ sao lại dùng cho printf nhỉ??? mình đang nhập vào cơ mà chứ có phải xuất ra đâu?
    ttecak ?

  6. #6
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Lỗi của lệnh scanf

    À uh hoá ra là thế nhưng mà R này thế cái stdout thì dùng cho fprint chứ sao lại dùng cho printf nhỉ??? mình đang nhập vào cơ mà chứ có phải xuất ra đâu?
    Ông meocontaplamC làm cái gì thì mình cũng chịu, C thì mới học thui nên hỏi hóc quá cũng không biết trả lời đâu nha T_T. stdout là xuất thế thì dùng cho printf có vấn đề gì nhỉ ?
    scanf(...) <->fscanf(stdin,...) ?

  7. #7
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Sau khi nhập ten xong thi chương trình tắt,
    Bạn xem ở dòng in đỏ
    Code:
    typedef struct
       {
        char ho[20];
        char ten[10];
        double luong;
        int tuoi;
        char diachi[10];
       } hoso;
    
    void NhapDS(hoso a[30],int n)
      {
       int i;
       for (i=1;i<=n;i++)
         {
          printf("+ Nhuoi thu %d: \n",i);
          fflush(stdin);
    	  printf("   Ho :  ");gets(a[i].ho);
          printf("   Ten:  ");gets(a[i].ten);
          fflush(stdout);
          printf("   luong:  ");scanf("%lf",&a[i].luong);
          printf("   Tuoi:   ");scanf("%d",&a[i].tuoi);
          fflush(stdin);
          printf("   Dia chi: ");gets(a[i].diachi);
          printf("\n\n");
    Cái này chẳng phải do lỗi gì đâu . Nếu có lỗi thì CT đã chạy ko được rồi . Ở đây bạn chỉ cần thay stdout trong dòng in đỏ bằng stdin thôi . Muốn hiểu tại sao xin vào đây xem các hàm fflush , scanf , gets :
    stdin và stdout là tên 2 tệp tin dòng vào chuẩn và dòng xuất chuẩn ( màn hình ) trong C .

  8. #8
    Ngày gia nhập
    01 2008
    Bài viết
    28

    Dù sao cũng rất cám ơn mọi người dã đóng góp ý kiến cho mình
    nhưng mà hix hix mình đã xem và sửa mọi kiểu nhưng mèo vẫn hoàn mèo thôi(tức là vẫn lỗi đó).sau đây mình sẽ gửi toàn bộ bài đó cho mọi người xem xét
    Code:
    # include<stdio.h>
    # include<conio.h>
    # include<string.h>
    
    typedef struct
       {
        char ho[20];
        char ten[10];
        double luong;
        int tuoi;
        char diachi[10];
       } hoso;
    
    void NhapDS(hoso a[30],int n)
      {
       int i;
       for (i=1;i<=n;i++)
         {
          printf("+ Nhuoi thu %d: \n",i);
          fflush(stdin);
    	  printf("   Ho :  ");gets(a[i].ho);
          printf("   Ten:  ");gets(a[i].ten);
          fflush(stdout);
          printf("   luong:  ");scanf("%lf",&a[i].luong);
          printf("   Tuoi:   ");scanf("%d",&a[i].tuoi);
          fflush(stdin);
          printf("   Dia chi: ");gets(a[i].diachi);
          printf("\n\n");
         }
      }
    
    void InDS(hoso a[],int n)
       {
        int i;
        char *blank=" ";
        for (i=1;i<=n;i++)
          {
           printf("%d",i);
           strcat(a[i].ho,blank);
           strcat(a[i].ho,a[i].ten);
           printf("    ");
           puts(a[i].ho);
           printf("                    %lf",a[i].luong);
           printf("       %d",a[i].tuoi);
           printf("        ");
           puts(a[i].diachi);
          }
       }
    
    
    void Sapxep(hoso a[],int n)
      {
       int j,i;
       hoso tg;
    
       for (i=1;i<=n-1;i++)
        for (j=i+1;j<=n;j++)
          if (strcmp(a[i].ten, a[j].ten)>0)
           {
    	tg=a[i];
    	a[i]=a[j];
    	a[j]=tg;
           }
      }
    
    void main()
      {
      clrscr();
       hoso a[30];
       int n;
       printf("Nhap so nguoi: n = ");scanf("%d",&n);
       NhapDS(a,n);
       Sapxep(a,n);
       InDS(a,n);
    
    
      getch();
      return 0;
      }

  9. #9
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Nói thiệt với bạn cái hôm tui coi bài này tui đoán chắc bạn dính lỗi này, đó là vì sao tui kêu bạn ghi main ra, mãng A của bạn 30 phần tử bạn xem lại cái vòng for của bạn bên trong cái hàm nhapDS xem, nó có gì lạ không nhỉ ?

  10. #10
    Ngày gia nhập
    12 2007
    Bài viết
    224

    bạn có bị lộn gì ko vậy , mình chạy thử thấy ngon lành mà . chỉ có điều đừng return trong hàm void main() nhé . ý mà hôm nọ mình nhầm nhé . ko cần phải sửa stdout thành stdin đâu , bỏ luôn cũng ok đó .
    Đã được chỉnh sửa lần cuối bởi sieuphuong : 13-02-2008 lúc 11:41 PM.

Các đề tài tương tự

  1. Bài tập nâng cao về hàm scanf và xâu
    Gửi bởi langman trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 30
    Bài viết cuối: 24-02-2016, 02:51 PM
  2. Cho hỏi về hàm scanf().
    Gửi bởi black horse trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 20-07-2012, 06:40 PM
  3. 2 lần scanf không được
    Gửi bởi boy_popping trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 21-05-2010, 09:36 AM
  4. Lỗi khi gọi hàm scanf
    Gửi bởi tunghero_vt trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 4
    Bài viết cuối: 13-03-2009, 01:32 PM
  5. Hàm scanf() với gets()
    Gửi bởi sangu trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 18-11-2008, 09:10 PM

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