01/10/2018, 15:52
Chuỗi ký tự trong C
cho em ko dùng ham strcpy để chép ký tự, mà dùng phép gán từng ký tự mà ko in ra được chuỗi k giống chuỗi s được ạ
#include <stdio.h>
#include <string.h>
int main()
{
char s[30], k[30];
gets(s);
for(int i = 0; i < strlen(s); i++)
{
k[i] = s[i];
}
printf("
%d
", strlen(s));
puts(s);
printf("
");
puts(k);
printf("
%d", strlen(k));
}

Bài liên quan
Bạn thiếu ký tự
\0
là k[i] = ‘\0’ hay k[i+1] vậy anh,
Là
i + 1
đó. Kí tự\0
luôn phải đặt sau kí tự cuối của chuỗi, sau khi thoát khỏi vòng lặp thìi
sẽ có giá trị bằng độ dài của chuỗi vừa copy, +1 để thêm\0
vào. Hoặc có thể sử dụng luônstrlen()
:k[strlen(s) + 1] = '\0';
Mà cách này không an toàn, chuỗi >= 30 sẽ bị tràn. Học cấp phát bộ nhớ để hiểu rõ hơn.
Thực ra thân hàm strcpy có thể chỉ có một dòng:
Đây cũng là cách nhớ
*
và++
.khi cấp phát bộ nhớ động thì khi nhập tên làm sao em biết được kích thước chuỗi ban đầu bằng bao nhiêu cấp phát thế a, hay ta cấp 1 kích cỡ N rồi realloc lại ạ. Như e làm thế này đã được chưa a
Để làm mảng tự co giãn thì phải xác định kích thước khi khởi tạo và khi nào thì giãn hay co. Thường mảng sẽ giãn theo phương trình: new_capacity = old_capacity * f(old_capacity) với f là step function. Để dễ hình dung, ta xét f(x) = 1 + e^(-x/c).
Phần nhập từ bàn phím thì dùng fgets cho vào buffer trước rồi strlen cho đến hết, nhưng có đk thì lúc nào cũng có size đầu tiên.
Một cách là bạn có thể đểm từ 0 tới khoảng trắng đầu tiên để xác định kích thước cần
malloc()
, cách khác là dùngstrtok()
để táchNguyen Van A
thành"Nguyen", `"Van", "A"
rồi in ra cái đầu tiên.Chương trình đơn giản thì 1 lần
malloc()
rồifree()
thôi, quản lý bộ nhớ là một thứ lằng nhằng.Em cám ơn a, cho em hỏi thêm là từ khóa static có ý nghĩa gì vậy ạ
cái này e thấy khó hiểu quá anh
Trong ngữ cảnh này thì
static
có nghĩa là “đừng đemnhap_ten()
ra ngoài module khác, chỉ dùng nội bộ trong phạm vi của file này” (chính xác hơn, là translation unit).Cái này thì tùy người, bạn có thể không dùng nếu thấy không cần, tuy nó là thói quen (practice) tốt.
vâng anh, cho em hỏi nữa là trong hàm main anh giải phóng ‘ten’ và ‘ho’ là giải phóng luôn bộ nhớ mà mình cấp phát ở hàm con phải không a. CÓ phải là do 2 con trỏ chỉ đến nhau thì mình giải phóng một thằng thì con trỏ kia cũng giải phóng không ạ
Đúng rồi, cấp phát ở đâu thì phải free sau đó. Còn nếu 2 pointer trỏ tới nhau thì khi 1 con trỏ bị giải phóng thì con trỏ kia sẽ trỏ tới 1 giá trị không xác định, gọi là rác:
y vẫn sẽ trỏ tới ô nhớ mà x trỏ tới trước đó, nhưng ô nhớ này đã bị
free()
và bị viết chồng lên một giá trị ngẫu nhiên.Vậy phần ở trên anh cấp phát bộ nhớ ở các hàm con, khi vào hàm main() anh dùng xong vẫn giải phóng được ạ
Giữ được con trỏ là được.