Cơ chế hoạt động của hàm strcpy trong việc xóa bỏ khoảng trống

em không hiểu hàm strcpy(&,&) trong này hoạt động như nào để xóa khoảng trắng cả, mn giải thích giúp e với.

void main()
{int i; char s[255];
printf("nhap s"); gets(s);
fflush(stdin);
// xoa ki tu trang o dau xau
while (s[0]==' ')
strcpy(&s[0],&s[1]);// xoa ki tu chua dau cach
// xoa ki tu trang o cuoi xau
while (s[strlen(s)-1]==' ')
strcpy(&s[strlen(s)-1],&s[strlen(s)]);//xoa ki tu chua dau cach

Comment khá rõ mà anh / chị

Khi mà kí tự đầu là khoảng trắng thì lấy toàn bộ chuỗi kể từ vị trí s[1] copy vào xâu ban đầu.
Nếu thắc mắc tại sao lại là có dấu & trước s[0] và s[1] thì nhớ lại 1 chút
_ Có hàm strcpy (arr1 , arr2) dùng để copy toàn bộ phần tử ở mảng arr2 sang arr1

  • arr1 ở đây là mảng s nên thay bằng &s[0] do tên mảng luôn trỏ đến phần tử đầu tiên của mảng
  • arr2 ở đây sẽ tương ứng với 1 mảng phụ giống mảng s nhưng bỏ đi phần tử s[0]. Lúc này arr2[0] = s[1] ; arr2[1] = s[2] … (tiếp đến các phần tử về sau) nên có thể thay arr2 bằng &s[1]

Tương tự với phần xoá ở cuối câu
Em cũng chỉ là newbie nên giải thích hơi khó hiểu
Nếu anh/chị vẫn chưa hiểu thì em nghĩ anh chị có thể tìm đọc một số tài liệu trên google về mối quan hệ giữa mảng và con trỏ ạ

3 Likes

Nói cho gọn thì ghi đè kí tự phía sau vào dấu cách. Việc ghi đè xem như đã xóa bỏ dấu cách luôn rồi.
Nhưng đoạn mã xóa dấu cách ở cuối bị dư khi dùng strcpy(), chỉ cần gán kí tự cách cuối thành NULL (\0).

5 Likes

Tuyệt đối không sử dụng strcpy cho vùng nhớ chồng lấn nhé :smiley: Lỗi ẩn đấy.

3 Likes

Wow, ai code kinh dị thế, tại hạ cam bái hạ phong :grimacing:

1 Like

Chắc đem từ Pascal qua :smiley:

Mà bài này cũng chỉ là thao tác mảng thôi.

3 Likes

Hàm strcpy() sẽ thực hiện 1 công việc ghi đè, tiêu tốn khá nhiều công sức của cpu.
Dựa vào kiến thức của chuỗi, và con trỏ, em hãy cải tiến thuật toán lại sao cho không cần phải xài strcpy (cũng như tự mình viết vòng lặp để ghi đè…)

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?