Cách làm việc với Text: C String Concatenation hiệu quả

Khi bạn sử dụng một ngôn ngữ lập trình nào. Thì đều phải bắt đầu xây dựng các ứng dụng cụ thể. Hiện nay, có rất nhiều ngôn ngữ hiện đại tích hợp. Để xử lý dữ liệu văn bản (hay các chuỗi). Tuy nhiên, khi làm việc với ngôn ngữ C. Thì bạn phải thực hiện thêm những bước khác và phải chiếm thêm bộ nhớ. Vậy làm việc với text: C String concatenation là gì thì cùng Box.edu tìm hiểu nhé!

Xem thêm: Tổng hợp 25 câu hỏi phỏng vấn C phổ biến nhất hiện nay

Xem thêm: Hướng dẫn cách đọc từ các tệp trong C bằng Fread

Xem thêm: Kiến thức cơ bản về lập trình C – Hướng dẫn sử dụng ngôn ngữ C

Mục lục bài viết

Tổng quan về làm việc với Text

tong-quan-ve-lam-viec-voi-text.jpg

Tổng quan về làm việc với Text

Làm việc với Text: C String Concatenation

Một trong những hoạt động chuỗi phổ biến nhất. Đối với bất kỳ loại ngôn ngữ nào chính là hành động nối. Nghĩa là có thể thêm nội dung của một chuỗi vào cuối các chuỗi khác. Trên thực tế có rất nhiều ứng dụng của chương trình này. Tuy nhiên, khái niệm cơ bản về việc có thể xây dựng một chuỗi văn bản. Là rất có giá trị, dù là bạn đang viết một ứng dụng console cơ bản hay một GUI chính thức.

Cách làm việc với Text: C String Concatenation 

Bản thân ngôn ngữ này có sự hỗ trợ rất hạn chế cho chuỗi. Chủ yếu cho phép bạn chỉ định các dữ liệu văn bản trong mã. Và dựa vào các hàm thư viện để có thể thực hiện các thao tác trên chúng.

Các chuỗi này sẽ có dạng mảng ký tự thông thường – chúng đều là các chuỗi ký tự liền nhau. Các chuỗi ký tự này sau đó được kết thúc bằng ký tự “NULL” (những ký tự có giá trị ASCII bằng 0). Đây là ký tự chỉ định nó là một chuỗi trái ngược với một khối ký tự ngẫu nhiên. Bộ kết thúc này cho phép người lập trình biết nơi kết thúc của chuỗi văn bản. Do vậy nó chính xác là nơi mà một vòng lặp sẽ ngừng xử lý. Vì dữ liệu văn bản có thể có độ dài khá lớn.

Trong mã, bất kỳ thứ gì được đặt trong dấu ngoặc kép. Đều có thể làm dẫn đến biểu thức chuỗi C – một mảng ký tự theo sau là dấu chấm dứt NULL. Một ví dụ cụ thể:

“Chào thế giới!”

Biểu thức này trong C sẽ làm một con trỏ đến một mảng ký tự chứa thông báo văn bản ở trên. Bao gồm tất cả là 13 ký tự riêng lẻ, theo sau là một dấu chấm dứt NULL. Vì biểu thức này sẽ trả về một con trỏ đến ký tự đầu tiên. Do đó bạn có thể lưu trữ vị trí bộ nhớ của thông báo này như sau:

char * myMessage = “Xin chào, Thế giới!”;

Nếu bạn khai báo như ở trên, thì nội dung của chuỗi sẽ ở chế độ chỉ đọc. Bất kỳ sự nỗ lực nào để ghi vào nó đều có thể dẫn đến hành vi không xác định. Hoặc dẫn đến việc chương trình của bạn có thể bị sập. Vì mục tiêu chung thì bạn có thể nối chuỗi dựa trên sự kết hợp của hai hoặc nhiều chuỗi với nhau. Khi đó bạn có thể khai báo theo chuỗi như sau:

char myMessage [] = “Xin chào, Thế giới!”;

Sau đó, nội dung của chuỗi sẽ được ghi lại. Loại “myMessage” trong trường hợp này là một mảng các ký tự có độ dài cố định là 14 (13 ký tự cộng với dấu chấm hết NULL). Ngược lại với một con trỏ tới một ký tự như trong ví dụ khác ở trên.

Một điều lưu ý là khi bạn khai báo một chuỗi theo kiểu này. Sau này bạn có thể gán một con trỏ vào vị trí bộ nhớ của nó. Và vẫn ghi vào nó bằng các phép toán con trỏ. Điều này là do con trỏ đang trỏ đến một vị trí mà có thể ghi trong bộ nhớ. Trước đây, thông thường chỉ yêu cầu C gán một con trỏ cho một tập dữ liệu cố định. Với khai báo mảng, các bạn đang yêu cầu C phải phân bổ một số không gian trên ngăn xếp cho chuỗi của mình.

Câu hỏi đặt ra là khi những điều này đã được thiết lập cụ thể thì làm thế nào để kết hợp 2 hay nhiều chuỗi lại với nhau? Câu hỏi rất quan trọng vì khai báo mảng ở một độ dài cố định

Tìm hiểu về hàm Strcat

tong-quan-ve-ham-strcat.jpg

Tìm hiểu về hàm Strcat

Cách thức hoạt động của Strcat

Làm việc với Text: C String Concatenation đặc biệt với hàm Strcat. Đầu tiên bạn cần biết cách khai báo một mảng xác định độ dài nhất định thay vì để C đếm các ký tự. Cụ thể là:

char myMessage [256] = “Xin chào, Thế giới!”;

Đối với khai báo này, chúng tôi đang phân bổ không gian chính xác cho 256 ký tự trong bộ nhớ, phần đầu chứa 13 ký tự của cụm từ cổ điển cộng với dấu chấm dứt NULL ở vị trí 14. Với không gian bổ sung sau dấu chấm dứt NULL, thì các bạn sẽ có chỗ để thêm nhiều dữ liệu hơn. Và hiện nay có một hàm trong thư viện chuẩn C đã đề cập cụ thể đến việc kết hợp các chuỗi lại với nhau. Do vậy bạn hãy đảm bảo rằng bạn #include tiêu đề thích hợp ở đầu tệp nguồn của bạn.

Ví dụ về hàm Strcat

#include <string.h>

Tiêu đề string.h ở ví dụ này chứa hàm chúng ta cần cùng với nhiều hàm liên quan khác. Tuy nhiên, cái mà các bạn đang tập trung vào đó là hàm “strcat”, được định nghĩa trong thư viện chuẩn tương tự như sau:

char * strcat (char * dst, char * src);

Ở đây, chúng ta có thể thấy rằng strcat là một hàm nhận một con trỏ đến chuỗi đích cũng như chuỗi nguồn và trả về một con trỏ đến chuỗi kết hợp thu được. Lưu ý rằng vì chúng ta có thể sẽ kết hợp một hoặc nhiều chuỗi nguồn vào cùng một đích, chúng ta sẽ không cần sử dụng giá trị trả về của hàm strcat. Tuy nhiên, nếu bạn cần, bạn có thể chỉ cần gán kết quả của nó cho một con trỏ ký tự.

Bây giờ giả sử chúng ta có hai thông điệp riêng biệt mà chúng ta muốn ghép lại với nhau, được khai báo như sau:

char firstMessage [256] = “Con cáo nâu nhanh nhẹn”;
 char secondMessage [] = “nhảy qua con chó lười biếng.”;

Cần lưu ý rằng chúng tôi đã khai báo thêm dung lượng trong firstMessage. Mặc dù bạn không cần quá 256 ký tự trong trường hợp này, nhưng vẫn nên phân bổ nhiều không gian hơn một chút so với nhu cầu của bạn, để bạn có một khoảng trống trong trường hợp bạn muốn nối nhiều chuỗi hơn.

Bây giờ chúng ta sẽ kết hợp chúng lại với nhau:

strcat (firstMessage, secondMessage);

Hãy quan sát cách thức mà chúng hoạt động:

printf (“% s \ n”, firstMessage);

Kết quả sẽ trả về cho bạn thông tin dưới đây:

The quick brown fox jumps over the lazy dog

Chú ý một điều là có một dấu chấm dứt NULL ở cuối tin nhắn đầu tiên và một dấu chấm dứt NULL đánh dấu nơi kết thúc của một chuỗi, tại sao đầu ra không chỉ đơn giản là “Con cáo nâu nhanh nhẹn”?

Điều này là do sự kỳ diệu của hàm strcat. Hàm này được thiết kế đặc biệt để xử lý các chuỗi được kết thúc bằng NULL và nó còn tính đến thực tế là nhiều chuỗi sẽ có các đầu cuối NULL của riêng chúng. Do vậy nó tự động loại bỏ các đầu cuối NULL khỏi đích khi chúng đặt vào một chuỗi nguồn mới. 

Làm việc với Text: C String Concatenation – Strcat

Tuy nhiên có một vấn đề đó là hàm strcat hoạt động tốt khi lập trình viên đã thực hiện mọi việc đúng cách, nhưng nếu có nhiều người trong một dự án và ai đó quyết định nhầm thì sẽ xảy ra:

char msg1 [] = “Kiểm tra, thử nghiệm,”;
 char msg2 [] = “1, 2, 3 ...”;
 strcat (msg1, msg2);

Mới đầu quan sát có thể bạn sẽ không nhận ra điều gì sai. Nhưng hãy chú ý đến lượng không gian chúng ta đang phân bổ cho msg1. Vì ngôn ngữ C đang đếm nó cho chúng ta, lúc này bạn sẽ nhận được tổng 19 ký tự trong bộ nhớ để làm việc với (bao gồm cả ký tự kết thúc NULL). 

Đây là một ví dụ đơn giản về sự cố rất phổ biến trong C đó là: sự cố tràn bộ đệm. Trên các máy tính hiện đại, điều này sẽ dẫn đến sự cố trong trường hợp xấu nhất. Nhưng trên các hệ thống kém an toàn hơn, điều này còn có thể dẫn đến việc ghi đè bộ nhớ không thuộc về ứng dụng của bạn. 

Vấn đề này được đánh giá là rất dễ gặp phải, do đó cần thêm một vài chức năng mới vào thư viện tiêu chuẩn C:

char * strncat (char * dst, const char * src, size_t count);

Hàm strncat này hoạt động giống hệt như hàm strcat. Tuy nhiên, nó có thêm một tham số cho số ký tự cần sao chép. Mặc dù điều này vẫn không ngăn lập trình viên nhập sai giá trị cho ‘count’. Nhưng nó vẫn còn tồn tại một chặng đường dài. Trong việc ngăn chặn tình trạng vượt quá bộ đệm ngẫu nhiên. Đồng thời, cũng đảm bảo rằng nó sẽ không bao giờ sao chép. Nhiều hơn ‘đếm’ số ký tự từ nguồn đến đích. Hiện nay, không có nhiều lý do để sử dụng hàm strcat thông thường trên strncat. Nhưng nó vẫn có ích trong việc dạy cách nối chuỗi hoạt động trong ngôn ngữ C.

Lưu ý đối với hàm Strcat

Khi bạn bắt đầu viết các ứng dụng trong thế giới thực bằng ngôn ngữ lập trình C. Bạn sẽ  dễ dàng nhận thấy việc nối chuỗi là rất quan trọng. Và nó không đơn giản như nói “blah” + “blah blah” như trong các ngôn ngữ cấp cao hơn. Nhưng đồng thời bạn cũng có nhiều quyền kiểm soát hơn đối với cách sử dụng bộ nhớ của mình. Khi bạn đã có nền tảng C vững chắc. Bạn có thể bắt đầu chuyển sang người anh lớn hơn của C. Và bắt đầu quá trình đạt được các kỹ năng C++ có giá trị. 

Tổng kết

Box.edu mong rằng làm việc với Text: C String Concatenation. Sẽ giúp các bạn hiểu hơn về các hành động nối. Từ đó, có thể giúp am hiểu hơn về ngôn ngữ lập trình C phục vụ. Cho các hoạt động công việc trong lĩnh vực lập trình này.

4.6/5 - (11 bình chọn)
Xin chào các bạn! Mình là Hà Nguyên Phương Hiện đang là tác giả của Box.edu.vn website nổi tiếng chuyên review, đánh giá, giới thiệu các khóa học hay nhất hiện nay.