Copy chuỗi trong C++ (strcpy, strcpy_s, strncpy) | Laptrinhcanban.com

Copy chuỗi trong C++ (strcpy, strcpy_s, strncpy)

Hướng dẫn copy chuỗi trong C++. Bạn sẽ học được cách copy chuỗi bằng cách sử dụng hàm strcpy trong C++ sau bài viết này.

Chúng ta có 3 phương pháp để copy chuỗi trong C++ như sau:

  • Hàm strcpy(): Copy toàn bộ chuỗi ban đầu
  • Hàm strcpy_s(): Copy toàn bộ chuỗi ban đầu
  • Hàm strncpy(): Copy số lượng ký tự chỉ định từ chuỗi ban đầu

Copy toàn bộ chuỗi trong C++ | hàm strcpy()

Hàm strcpy() trong C++ là một hàm có sẵn trong header file cstring, giúp chúng ta copy toàn bộ chuỗi chỉ định (bao gồm cả ký tự kết thúc chuỗi \0).

Chúng ta sử dụng hàm strcpy() để copy toàn bộ chuỗi trong C++ với cú pháp sau đây:

strcpy(target, source);

Trong đó:

  • targe là chuỗi đích
  • source là chuỗi nguồn.

Hàm strcpy() sẽ copy toàn bộ nội dung của chuỗi source và phục chế nó vào chuỗi target. Lưu ý là hai chuỗi này cần phải tồn tại trước đó, thông qua việc khởi tạo hay khai báo chuỗi trong C++.

Và chúng ta cần phải viết thêm dòng #include <cstring> để load header file cstring để có thể sử dụng được hàm strlen() trong chuơng trình.

Ví dụ cụ thể:

#include <iostream>
#include <cstring>
using namespace std;

int main(){
char str1[30];
char str2[30] = "I love C/C++";
cout << "str2: " << str2 <<endl;

//Copy toàn bộ chuỗi str2 vào chuỗi str1
strcpy(str1, str2);
cout << "str1: " << str1;
}

Kết quả:

str2: I love C/C++
str1: I love C/C++

Lưu ý hiện tượng tràn bộ nhớ khi sử dụng hàm strcpy() để copy chuỗi trong C++.

Khi sử dụng hàm hàm strcpy() để copy chuỗi trong C++, chúng ta cần phải chú ý đến hiện tượng tràn bộ nhớ (Buffer overflow) trong chương trình C++.

Về mặt ngôn ngữ thì Buffer ở đây chỉ đến vùng ghi dữ liệu bên trong bộ nhớ máy tính. Và overflow có nghĩa là buffer (bộ nhớ) đã bị tràn đầy. Nếu trong khi chạy một chương trình C++ mà hiện tượng tràn bộ nhớ xảy ra, thì sẽ bị ảnh hưởng đến xử lý chương trình, gây ra các hoạt động không theo ý muốn. Ví dụ như, chương trình có thể ghi đè bất hợp pháp lên các vùng ghi dữ liệu bên cạnh vùng đã bị tràn đầy chẳng hạn.

Trong chương trình C++, chúng ta có khả năng ghi dữ liệu có kích thước lớn hơn bộ nhớ cấp phát cho biến. Ví dụ, một chuỗi 16 byte vẫn có thể được lưu lại trong một biến chỉ có khả năng ghi dữ liệu lớn nhất là 4 byte chẳng hạn.

Hãy cùng xem ví dụ sau đây:

#include <iostream>
#include <cstring>
using namespace std;

int main(){
char str1[4];
char str2[30] = "I love C/C++";
cout << "str2: " << str2 <<endl;

//Copy toàn bộ chuỗi str2 vào chuỗi str1
strcpy(str1, str2);
cout << "str1: " << str1;
}
//str2: I love C/C++
//str1: I love C/C++

Trong chương trình trên, chúng ta đã copy toàn bộ chuỗi str2 vào chuỗi str1 bằng hàm strcpy(), và kết quả cũng được in bình thường ra màn hình.

Nhưng hãy lưu ý rằng chúng ta đã khai báo chuỗi str1 với kích thước chỉ có 4 byte, trong khi chuỗi "I love C++/C++" có kích thước nhiều hơn thế. Mặc dù thế, chương trình vẫn tiến hành copy, và ở đâu đó trong bộ nhớ máy tính, thì đã xảy ra hiện tượng tràn bộ nhớ mất rồi.

Vì thế, khi copy chuỗi trong C++, bạn hãy chú ý tới kích thước của chuỗi đích, và kích thước của chuỗi cần copy để không xảy ra tràn bộ nhớ khi xử lý nhé.

Copy toàn bộ chuỗi trong C++ | hàm strcpy_c()

Nếu bạn đang phát triển chương trình C++ trên môi trường Visual Studio, chúng ta không thể sử dụng tới hàm copy chuỗi strcpy() được.

Khi tiến hành compile chương trình chứa hàm strcpy() thì lỗi compile sẽ xảy ra, và có thêm màn hình hướng dẫn chúng ta hãy sử dụng tới hàm strcpy_c() để thay thế.

Lý do cũng dễ hiểu, bởi việc copy chuỗi bằng hàm strcpy() có một nhược điểm là nếu kích thước chuỗi cần copy lớn hơn kích thước của chuỗi đích chứa nó, thì hiện tượng tràn bộ nhớ sẽ bị xảy ra.

Và để khắc phục điểm yếu này của hàm strcpy() mà hàm strcpy_c() đã được ra đời. Trong hàm strcpy_c() có thêm chỉ định kích thước chuỗi đích, giúp chúng ta quản lý và không để xảy ra hiện tượng tràn bộ nhớ trong quá trình copy chuỗi trong C++.

Lưu ý rằng strcpy_c() không phải là một hàm chuẩn trong C++, và nó có thể không hoạt động trong một số môi trường lập trình C++.

Chúng ta sử dụng hàm strcpy_c() để copy toàn bộ chuỗi trong C++ với cú pháp sau đây:

strcpy_c(target, rsize_t, source);

Trong đó:

  • target là chuỗi đích
  • rsize_t là kích thước chuỗi đích
  • source là chuỗi nguồn.

Lưu ý là chúng ta cũng cần phải viết thêm dòng #include <cstring> để load header file cstring để có thể sử dụng được hàm strcpy_c() trong chuơng trình.

Ví dụ cụ thể:

#include <iostream>
#include <cstring>
using namespace std;

int main() {
char str1[16] = "Hello World!";
char str2[16];
cout << "str2: " << str2 <<endl;

//Copy toàn bộ chuỗi str2 vào chuỗi str1
strcpy_s(str2, 16, str1);
cout << "str1: " << str1;
return 0;
}
//Hello World!

Copy số lượng ký tự chỉ định từ chuỗi ban đầu | hàm strncpy()

Hàm strncpy() trong C++ cũng là một hàm có sẵn trong header file cstring, giúp chúng ta Copy số lượng ký tự chỉ định từ chuỗi ban đầu.

Chúng ta sử dụng hàm strncpy() để copy toàn bộ chuỗi trong C++ với cú pháp sau đây:

strncpy(target, source, n);

Trong đó:

  • target là chuỗi đích
  • source là chuỗi nguồn.
  • n là số ký tự lớn nhất có thể copy

Hàm strncpy() sẽ copy từ chuỗi source một số lượng n ký tự, và dán nó vào chuỗi target. Hai chuỗi này cần phải tồn tại trước đó, thông qua việc khởi tạo hay khai báo chuỗi trong C++.

Cần chú ý là nếu chỉ định giá trị của n nhỏ hơn độ dài của chuỗi nguồn khi sử dụng hàm strncpy() thì ký tự kết thúc chuỗi \0 sẽ không được copy vào chuỗi đích, do đó chúng ta cần phải thêm xử lý nối ký tự này vào chuỗi đích target.

Và chúng ta cần phải viết thêm dòng #include <cstring> để load header file cstring để có thể sử dụng được hàm strlen() trong chuơng trình.

Ví dụ cụ thể:

#include <iostream>
#include <cstring>
using namespace std;

int main(){
char str1[30];
char str2[30] = "I love C++/C++";
cout << "str2: " << str2 <<endl;

//Copy nhiều nhất 6 ký tự từ chuỗi str2 vào chuỗi str1
strncpy(str1, str2,6);
str1[6] = '\0'; //Gán ký tự kết thúc chuỗi \0
cout << "str1: " << str1;
}

Kết quả:

str2: I love C++/C++
str1: I love

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách tính copy chuỗi trong C++ rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C++ trong các bài học tiếp theo.

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.