Dẹp Cfree vào thùng rác! Cho tui hỏi char* ten và và char* thang là cái gì ?
mình có đoạn code về bài tập struct, khi compile trong Code::Blocks và free C thì ko có error và warning
Khi Run thì free C chạy tốt, nhưng thằng Code::Blocks thì khi nhập họ tên xong ,ấn Enter thì Windows nó hiện lên thông báo lỗi :"code::blocks has encountered prolem and needs to close. We are sorry.... "
bạn nào co kinh nghiệm có thể giải thích cho mình đc ko? cùng 1 trình biên dịch GCC mà sao free C chạy đc, còn C::B báo lỗi
điên đầu vì cái này, đến nỗi quên luôn thằng visual C++ là chưa test, ko biết có bị giống C::B ko nữa
code here (srr, mình ko sử dụng đc tag CODE), ai dùng C::B thì test gùm
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
struct DATE
{
int ngay;
char* thang;
int nam;
};
typedef struct
{
char* hoten;
struct DATE ngaysinh;
float luong;
}PERSON;
void input(PERSON*);
void output(PERSON);
int main()
{
PERSON person;
input(&person);
output(person);
return 0;
}
void input(PERSON* ps)
{
int iTemp;
float fTemp;
printf("\nNhap ho ten nhan vien : ");
fflush(stdin);// xoa bo dem
gets(ps->hoten); // Nhap chuoi bang ham gets( )
printf("\nNhap ngay sinh: ");
scanf("%d", &iTemp); // Nhap so bang ham scanf( )
ps->ngaysinh.ngay = iTemp;
printf("\nNhap thang : ");
fflush(stdin);
gets(ps->ngaysinh.thang);
printf("\nNhap nam sinh : ");
scanf("%d", &iTemp);
ps->ngaysinh.nam = iTemp;
printf("\nNhap luong: ");
scanf("%f", &fTemp);
ps->luong = fTemp;
}
void output(PERSON ps)
{
printf("\nHo ten: %s ", ps.hoten);
printf("\nNgay sinh :%d %s %d ", ps.ngaysinh.ngay, ps.ngaysinh.thang, ps.ngaysinh.nam);
printf("\nLuong : %f ", ps.luong);
}
Dẹp Cfree vào thùng rác! Cho tui hỏi char* ten và và char* thang là cái gì ?
chạy ổn trên VC++6.0 là được rồi--> code OKCode:#include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> struct DATE { int ngay; char* thang; int nam; }; typedef struct { char* hoten; struct DATE ngaysinh; float luong; }PERSON; void input(PERSON*); void output(PERSON); int main() { PERSON person; input(&person); output(person); return 0; } void input(PERSON* ps) { int iTemp; float fTemp; printf("\nNhap ho ten nhan vien : "); fflush(stdin);// xoa bo dem gets(ps->hoten); // Nhap chuoi bang ham gets( ) printf("\nNhap ngay sinh: "); scanf("%d", &iTemp); // Nhap so bang ham scanf( ) ps->ngaysinh.ngay = iTemp; printf("\nNhap thang : "); fflush(stdin); gets(ps->ngaysinh.thang); printf("\nNhap nam sinh : "); scanf("%d", &iTemp); ps->ngaysinh.nam = iTemp; printf("\nNhap luong: "); scanf("%f", &fTemp); ps->luong = fTemp; } void output(PERSON ps) { printf("\nHo ten: %s ", ps.hoten); printf("\nNgay sinh :%d %s %d ", ps.ngaysinh.ngay, ps.ngaysinh.thang, ps.ngaysinh.nam); printf("\nLuong : %f ", ps.luong); }
Thiệt là cậu nghĩ code này đúng ?chạy ổn trên VC++6.0 là được rồi--> code OK
Cậu viết trên TC++ 3.0 à?
Nếu viết trên đó thì cậu muốn nhập vào thì nhập qua biến trung gian
Code:void input(PERSON* ps) { int iTemp; float fTemp; char*temp_hoten; temp_hoten=(char*)malloc(50*sizeof(char)); printf("\nNhap ho ten nhan vien : "); fflush(stdin);// xoa bo dem gets(temp_hoten) strcpy(ps->hoten,temp_hoten) //tương tự cho mấy trường còn lại // gets(ps->hoten); // Nhap chuoi bang ham gets( ) printf("\nNhap ngay sinh: "); scanf("%d", &iTemp); // Nhap so bang ham scanf( ) ps->ngaysinh.ngay = iTemp; printf("\nNhap thang : "); fflush(stdin); gets(ps->ngaysinh.thang); printf("\nNhap nam sinh : "); scanf("%d", &iTemp); ps->ngaysinh.nam = iTemp; printf("\nNhap luong: "); scanf("%f", &fTemp); ps->luong = fTemp; }
Vẫn crash như thường ! Coi lại giá trị của 2 thằng đó !
uhm mình nhầm,test không kỹ,nó chạy được bước đầu nhưg bước sau lại sai,vậy thì cứ thay con trỏ bằng mảng đi
hoten[10]
thang[10]
Now you got ituhm mình nhầm,test không kỹ,nó chạy được bước đầu nhưg bước sau lại sai,vậy thì cứ thay con trỏ bằng mảng đi
hoten[10]
thang[10]!
thực ra hàm cin.getline từ lâu đã không cho phép chạy cái chuỗi kiểu char * tên chuỗi từ lâu rồi,vì vậy cậu cũng nên bỏ thói quen cấp phát động cho chuỗi thế này đi thì hơn
Vấn đề không phải là getline(), và nếu cấp phát động thì phải cấp phát động cho dữ liệu của chúng ta chứ không phải giá trị tạm thời rồi dùng strcpy() vì vậy code của nthung cũng vẫn bị crash.
Đây là cách nếu dùng như trên :