01/10/2018, 15:04

Cần người giải đáp thắc mắc về struct trong C

Em mới học lập trình và đang làm bài tập về struct.
Đề bài yêu cầu em phải xây dựng một chương trình quản lý học sinh, sau đó viết chương trình thực hiện chức năng tìm kiếm theo tên.
Ý tưởng của em là dùng phép so sánh từng kí tự, so sánh giữa chuỗi tên và chuỗi tìm kiếm, qua đó tìm được vị trí những dữ liệu phù hợp rồi in ra.
Nhưng chương trình của em không chạy như ý muốn, sau khi test từng đoạn thì em phát hiện ra điểm này không như ý em:

[Album] Imgur

[Album] Imgur

Như đã trình bày ở trên thì kết quả sau cùng của hoc_sinh.ten đã không lưu lại nội dụng đã nhập lần cuối. Em đã tưởng rằng dữ liệu nguyên thủy và dữ liệu struct có thể sử dụng giống nhau, vậy em đã hiểu sai ở những chỗ nào ạ?

rogp10 viết 17:10 ngày 01/10/2018

Bạn dùng sai cú pháp VLA.

Trần Linh viết 17:08 ngày 01/10/2018

Bạn chưa khởi tạo vùng nhớ cho biến ten trong struct; đó là điều cấm kị! Cái vùng nhớ mà bạn đang thao tác với nó không phải thuộc về nó! Hoạt động chỉnh sửa cái biến đó có thể gây hại cho chương trình khác!

Kn Katori viết 17:13 ngày 01/10/2018

mình đã google nhưng mãi chưa tìm được thông tin liên quan, bạn có thể dành ít thời gian cho mình một đường link để tìm hiểu không?

Kn Katori viết 17:18 ngày 01/10/2018

Tài liệu hướng dẫn của mình không nói gì về vấn đề này, họ lấy ví dụ về kiểu int để nhập số và kiểu char* để nhập chuỗi kí tự liền.
Và sử dụng như bình thường, cho nên mình nghĩ có thể dùng tương tự với kiểu mảng.
Bạn có thể cho mình một tài liệu nào hướng dẫn đầy đủ hơn không?

Trần Linh viết 17:15 ngày 01/10/2018

bạn đọc được tiếng anh chứ :)) (ns thế thôi chứ mình phải dùng gg dịch )

Kn Katori viết 17:08 ngày 01/10/2018

tiếng anh đọc cũng có chút vốn, bạn cho mình tài liệu chính xác và đầy đủ nhất là được

Trần Linh viết 17:08 ngày 01/10/2018

https://www.tutorialspoint.com/cprogramming/c_strings.htm
cái này tiếng anh nek
còn 2 cái tiếng việt (C-style string trong C++ thực ra là mảng kí tự trong C)

dnh-cpp

6.1 Các thao tác cơ bản với mảng kí tự

memset(foo, '-', 7); cout << foo << endl; \-------every programmer should know memset! strcpy(str_destination, str_source);…


(của dạy nhau học)
www.howkteam.com

Mảng ký tự trong C++ (C-style strings) | Website hướng dẫn lập trình miễn phí |...

Chuỗi ký tự C-style bản chất là mảng 1 chiều các ký tự, kết thúc bằng ký tự ‘\0’ (null). Hay còn gọi là null-terminated string.


(bài này vs bài kế tiếp nha)

Kn Katori viết 17:13 ngày 01/10/2018

Ok, vậy là ở phần định nghĩa struct, mình phải định nghĩa dữ liệu ten là:
“char *ten;” thay vì “char ten[ ];”… => vậy là phần sau đó sẽ hoạt động được.
Cám ơn bạn.

Kn Katori viết 17:07 ngày 01/10/2018

trước đây mình đọc hướng dẫn thì con trỏ và mảng trong c có rất nhiều điểm giống nhau, và bản chất của mảng chính là con trỏ.
Cho nên mình đã không nghi ngờ khi sử dụng nó trong phần định nghĩa là như nhau. haizz

rogp10 viết 17:07 ngày 01/10/2018

Ok, vậy là ở phần định nghĩa struct, mình phải định nghĩa dữ liệu ten là:
“char *ten;” thay vì “char ten[ ];”… => vậy là phần sau đó sẽ hoạt động được.

Không hẳn. Vẫn có thể để char ten[100]; được.

Bùi Công Nguyên Nam viết 17:07 ngày 01/10/2018

Khai báo trong char[] bắt buộc phải có 1 hằng số nằm trong []. Lí do là để tránh xung đột bộ nhớ với các vùng nhớ khác.

Theo kinh nghiệm của mình thì ko khuyến khích dùng char vì có thể bị hạn chế nhiều về số lượng ký tự khi nhập. Nếu khai báo nhiều quá cũng gây lãng phí bộ nhớ. Thay vào đó mình dùng string

Nếu bạn vẫn muốn dùng char thì có thể làm theo cách này.Tuy nhiên ,về mặt mỹ quan thì nó ko dc hay cho lắm :))

int main (){
int n; // nhập số lượng kí tự
cin >> n;
char *p =new char[n]; // cấp phát bộ nhớ cho n kí tự
delete []p; // giải phóng vùng nhớ
}

Trần Linh viết 17:17 ngày 01/10/2018

bạn ấy viết code C nên ko có string

Kn Katori viết 17:11 ngày 01/10/2018

Khẳng định của bạn cũng giúp mình hiểu chắc chắn hơn về vấn đề

Kn Katori viết 17:16 ngày 01/10/2018

Ngại quá, mình lại gặp phải một lỗi mà bản thân không hiểu nổi, bạn có thể xem hộ mình không?

[Album] Imgur

mình thấy mình làm giống ví dụ ở đây https://www.youtube.com/watch?v=abSBt3oIt1M&list=PLE1qPKuGSJaBq4VFzTYrhzCiPvCoI8JDv&index=50

rogp10 viết 17:15 ngày 01/10/2018

Ngại quá, mình lại gặp phải một lỗi mà bản thân không hiểu nổi, bạn có thể xem hộ mình không?
https://imgur.com/a/ZRKpB

Do "longWF" là hằng chuỗi nên bị warn thôi. Lí do là khi gán vào không-const thì nội dung sẽ bị thay đổi, mà là vì những chuỗi này được viết thẳng vào exe nên nếu nó bị sửa là error ngay.

Vì vậy, nếu ko cần phải thay đổi bên trong thì ghi là const.

Trần Linh viết 17:15 ngày 01/10/2018

Câu trả lời thì bạn @rogp10 đã nói rồi :)) thôi thì mình nghĩ bạn nên dùng Array char đi thì hơn! a[100]

Bài liên quan
0