Thắc mắc về Con trỏ và xâu ký tự


Cho em hỏi ở ts.loai tại sao phải dùng con trỏ là*ts.loai

if(ts.tong>19)
   *ts.loai=“do”;
else 
   *ts.loai=“truot”;

mà không phải ts.loai. Nếu đung ts.loai thì phải sử dụng strcpy

if(ts.tong>19)
   strcpy(ts.loai,”do”);
else 
   strcpy(ts.loai,”truot”);

Code đủ

#include<stdio.h>
#include<stdio_ext.h>
#include<string.h>
int main()
{
    FILE *fp;
    int i,n;
    struct thisinh
    {
        char hoten[30],*loai[6];
        float toan,ly,hoa,tong;

    }ts;
    printf("nhap so thi sinh=");
    scanf("%d",&n);
    fp=fopen("diem.dat","wb");
    for(i=0;i<n;i++)
    {
        printf("nhap thong tin thi sinh thu %d\n",i+1);
        printf("ho ten: ");
        __fpurge(stdin);
        gets(ts.hoten);
        printf("diem toan");
        scanf("%f",&ts.toan);
        printf("diem ly");
        scanf("%f",&ts.ly);
        printf("diem hoa");
        scanf("%f",&ts.hoa);
        ts.tong=ts.toan+ts.ly+ts.hoa;
        if(ts.tong>19)
            *ts.loai="do";
        else
            *ts.loai="truot";
        fwrite(&ts,sizeof(ts),1,fp);
    }
fclose(fp);
        fp=fopen("diem.dat","rb");
        while(fread(&ts,sizeof(ts),1,fp)>0)
        {
            printf("%s %f %f %f %f %s\n",ts.hoten,ts.toan,ts.ly,ts.hoa,ts.tong,*ts.loai);
        }
        fclose(fp);
    return 0;
}

Khả năng là có 3 lý do mà bạn không dùng nút Print Screen hoặc copy/paste code:

  • Bạn chả biết đến nó;
  • Bạn siêu lười;
  • Bạn đang làm bài thi trên lớp;
7 Likes

bạn cop cả khai báo struct lên đây xem thử nào. “loai” khai báo kiểu mảng hay kiểu con trỏ?

1 Like

Mình dùng putty ạ còn code này là của cô

Em sửa rồi ạ. Em cảm ơn

Nếu mình biết ( hiểu rõ ràng vận dụng tốt) thì đã không phải đi hỏi. Mình cũng chưa học chuyên sâu bởi vì mình học tin đại cương nhiều cái không hiểu tại sao thầy cô code như thế. Kỳ này thì chưa học đến nhưng muốn tổng hợp kiến thức trước.

Cái mình nói ở đây không phải là bạn biết code hay không, cái mình muốn nói ở đây là tại sao bạn không chụp ảnh bằng phím PrintScreen mà lại phải dùng camera riêng.

Cái code này có vấn đề, vì khi khai báo char *loai[6] thì là mảng chứa 6 con trỏ, mỗi con trỏ trỏ đến 1 xâu ký tự, tức là tương ứng với 1 họ tên có đến 6 xâu kí tự “loại” -> bị thừa đến 5 xâu.

*ts.loai thực ra là *( ts.loai ), đây không phải là con trỏ nữa , mà là con trỏ trỏ đến con trỏ( ** ).
*ts.loai = "do"; tức là cho con trỏ đầu tiên của mảng “loai” ( tức là loai[0] ) trỏ đến xâu kí tự “do”. Làm như này quá khó hiểu cho sinh viên học tin đại cương.

Để đơn giản chỉ cần sửa thế này :

struct{
   char hoten[30],loai[10];
   float toan,ly,hoa,tong;
} ts;

Sau đó dùng hàm strcpy như bên trên.

HOặc có thể sửa thế này

struct {
   char hoten[30],*loai;
   float toan,ly,hoa,tong;
} ts;

sau đó gán ts.loai = "do";

2 Likes

Mình chép ra vở ok? Cô sdung máy chiếu và bọn mình không học phòng máy( ngày hôm đó) hôm đó là học lý thuyết buổi cuối. Ảnh này của người ta. Nếu đã lười thì t cũng chẳng muốn hỏi.

Ok mong bạn lượng thứ nếu bạn thấy khó chịu. Mình phải chất vấn vậy vì mình gặp quá nhiều người thích dùng camera chụp ảnh hơn là Print Screen ngay cả khi có máy cá nhân.

2 Likes

Quy định của diễn đàn là không được đăng code bằng ảnh, dù là sử dụng phím print screen hay sử dụng camera. Đối với code chỉ được sử dụng markdown.

Tuy nhiên, do đây là lần đầu bạn post bài nên mình mới bỏ qua, nếu post thứ 3 trở đi mà vẫn đăng ảnh code tương tự thì tụi mình hide và close để bạn tạo post mới đúng quy định.

Nếu bạn thấy cảm thấy phiền phức thì sẽ có một số trang web sẵn sàng trừ âm điểm, cắm cờ dẫn đến nick bị ban, không thể comment gì được. Điển hình là StackOverflow.

DNH thì không làm gắt đối với các bạn newbie. Có người hướng dẫn bạn cách đặt câu hỏi đúng, một số leader (như mình) sẽ sửa lại title và nội dung cho phù hợp để bạn có thể tham khảo. Thường leader sẽ làm vậy với 5 post đầu tiên, nhưng nếu ỷ lại không chịu tuân theo thì leader mình cũng sẽ hide và close luôn.

2 Likes

Vang. Em cam on a…

Vang a. Em se chu y. Em cam on

Nếu khai báo con trỏ thường là *loai và gán ts.loai=“do” thì không ra kết quả ạ.

Lúc in ra bạn bỏ * đi, như này

printf("%s ", ts.loai);
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?