Như bạn đã biết, cách tốt nhất để nối hai chuỗi trong lập trình C là sử dụng hàm strcat(). Tuy nhiên, trong ví dụ này, chúng ta sẽ nối hai chuỗi theo cách thủ công
Nối hai chuỗi mà không cần sử dụng strcat()
#include int main() { char s1[100] = "programming ", s2[] = "is awesome"; int length, j; // store length of s1 in the length variable length = 0; while (s1[length] != '\0') { ++length; } // concatenate s2 to s1 for (j = 0; s2[j] != '\0'; ++j, ++length) { s1[length] = s2[j]; } // terminating the s1 string s1[length] = '\0'; printf("After concatenation: "); puts(s1); return 0; }đầu ra
After concatenation: programming is awesomeỞ đây, hai chuỗi s1 và s2 được nối với nhau và kết quả được lưu trong s1
Điều quan trọng cần lưu ý là độ dài của s1 phải đủ để giữ chuỗi sau khi nối. Nếu không, bạn có thể nhận được kết quả không mong muốn
Nối chuỗi là một quá trình kết hợp hai chuỗi để tạo thành một chuỗi duy nhất. Nếu có hai chuỗi thì chuỗi thứ hai được thêm vào cuối chuỗi đầu tiên
Ví dụ: Xin chào + javaTpoint = Xin chào javaTpoint
Chúng ta có thể nối các chuỗi theo ba cách sau
- Nối hai chuỗi bằng vòng lặp
- Nối hai chuỗi bằng con trỏ
- Nối hai chuỗi bằng hàm strcat()
Nối hai chuỗi bằng vòng lặp
Phân tích chương trình trên
- Trong chương trình trên, chúng ta khai báo hai chuỗi i. e. , first_string và second_string. Giá trị của hai chuỗi này được người dùng lấy làm đầu vào
- Chúng ta sẽ nối hai chuỗi này và lưu kết quả của phép nối vào first_string
- Chúng tôi khai báo một biến số nguyên mới có tên là 'i'. Sau khi khai báo, chúng ta sẽ chạy một vòng lặp lặp từ i=0 cho đến khi gặp ký tự null của first_string. Khi quá trình thực hiện vòng lặp hoàn tất, thì giá trị của 'i' sẽ bằng độ dài của chuỗi cộng với một
- Chúng tôi sẽ xác định một vòng lặp mới khác, về cơ bản được sử dụng để nối hai chuỗi. Vòng lặp này bắt đầu từ j=0 và thực thi cho đến khi gặp ký tự null của chuỗi thứ hai. Trên mỗi lần lặp, ký tự nằm ở vị trí thứ j trong chuỗi_thứ_hai được lưu trữ ở vị trí thứ i của chuỗi_thứ_nhất. Bằng cách này, cả hai chuỗi được kết hợp với nhau để tạo thành một chuỗi duy nhất
đầu ra
Nối hai chuỗi bằng con trỏ
Phân tích chương trình trên
- Trong chương trình trên, chúng ta đã khai báo biến mảng ký tự, i. e. , chuỗi1 và chuỗi2. Chúng tôi lấy hai chuỗi làm đầu vào của người dùng và lưu trữ chúng trong các biến chuỗi1 và chuỗi2,
- Ta khai báo hai con trỏ char str1 và str2. str1 chứa địa chỉ của string1 và str2 chứa địa chỉ của string2
- Chúng tôi tạo một vòng lặp lặp lại cho đến khi gặp ký tự null của chuỗi1. Khi hoàn thành việc thực hiện vòng lặp, thì con trỏ str1 trỏ đến vị trí tồn tại ngay sau vị trí của ký tự cuối cùng
- Chúng tôi xác định một vòng lặp while khác lặp lại cho đến khi gặp ký tự null của chuỗi2. Trên mỗi lần lặp lại, ký tự được lưu trữ tại vị trí thứ j trong chuỗi2 được thêm vào chuỗi1 bằng cách sử dụng câu lệnh *str1=*str2
đầu ra
Nối hai chuỗi bằng strcat()
Bây giờ chúng ta sẽ xem cách nối hai chuỗi bằng hàm strcat(). strcat() là một hàm sẵn có được định nghĩa trong một chuỗi. tập tin tiêu đề h
Hãy xem ví dụ
Trong đoạn mã trên, chúng ta sử dụng hàm strcat() để nối hai chuỗi. Nó nhận hai chuỗi làm tham số và sau đó nối chuỗi thứ hai vào cuối chuỗi đầu tiên
Thêm số và chuỗi
CẢNH BÁO
C++ sử dụng toán tử + cho cả phép cộng và phép nối
Số được thêm vào. Chuỗi được nối
Nếu bạn cộng hai số, kết quả sẽ là một số
Thí dụ
int x = 10;
int y = 20;
int z = x + y;
Nếu bạn thêm hai chuỗi, kết quả sẽ là nối chuỗi
Thí dụ
chuỗi x = "10";
chuỗi y = "20";
chuỗi z = x + y;
Nếu bạn cố gắng thêm một số vào một chuỗi, sẽ xảy ra lỗi
Thí dụ
chuỗi x = "10";
int y = 20;
chuỗi z = x + y;
Bước đầu tiên để nối biến int và chuỗi ký tự là chuyển đổi một số nguyên thành chuỗi. Chúng tôi sử dụng hàm asprintf để lưu trữ số nguyên đã truyền dưới dạng chuỗi ký tự. asprintf là một phần của tiện ích mở rộng thư viện GNU C và có thể không có sẵn trong các triển khai khác. Nó hoạt động tương tự như #define _GNU_SOURCE #include #include #include #ifndef MAX #define MAX 100 #endif int main(int argc, char *argv[]) { const char* str1 = "hello there"; int n1 = 1234; char *num; char buffer[MAX]; if (asprintf(&num, "%d", n1) == -1) { perror("asprintf"); } else { strcat(strcpy(buffer, "Hello there, "), num); strcat(buffer, "! continued"); printf("%s\n", buffer); free(num); } exit(EXIT_SUCCESS); } 2 ngoại trừ bộ đệm chuỗi ký tự đích được phân bổ động bằng cách sử dụng lệnh gọi hàm #define _GNU_SOURCE #include #include #include #ifndef MAX #define MAX 100 #endif int main(int argc, char *argv[]) { const char* str1 = "hello there"; int n1 = 1234; char *num; char buffer[MAX]; if (asprintf(&num, "%d", n1) == -1) { perror("asprintf"); } else { strcat(strcpy(buffer, "Hello there, "), num); strcat(buffer, "! continued"); printf("%s\n", buffer); free(num); } exit(EXIT_SUCCESS); } 3 bên trong và con trỏ được trả về phải được giải phóng trước khi thoát khỏi chương trình. Sau khi số nguyên được chuyển đổi, chúng tôi xâu chuỗi các cuộc gọi strcpy và strcat để nối hai chuỗi ký tự đã cho trong bộ đệm mà người dùng cấp phát. Trong trường hợp này, chúng tôi tùy ý xác định macro #define _GNU_SOURCE #include #include #include #ifndef MAX #define MAX 100 #endif int main(int argc, char *argv[]) { const char* str1 = "hello there"; int n1 = 1234; char *num; char buffer[MAX]; if (asprintf(&num, "%d", n1) == -1) { perror("asprintf"); } else { strcat(strcpy(buffer, "Hello there, "), num); strcat(buffer, "! continued"); printf("%s\n", buffer); free(num); } exit(EXIT_SUCCESS); } 6 để biểu thị kích thước của bộ đệm đích, nhưng trong các tình huống thực tế, sẽ linh hoạt hơn khi sử dụng #define _GNU_SOURCE #include #include #include #ifndef MAX #define MAX 100 #endif int main(int argc, char *argv[]) { const char* str1 = "hello there"; int n1 = 1234; char *num; char buffer[MAX]; if (asprintf(&num, "%d", n1) == -1) { perror("asprintf"); } else { strcat(strcpy(buffer, "Hello there, "), num); strcat(buffer, "! continued"); printf("%s\n", buffer); free(num); } exit(EXIT_SUCCESS); } 3
#define _GNU_SOURCE #include #include #include #ifndef MAX #define MAX 100 #endif int main(int argc, char *argv[]) { const char* str1 = "hello there"; int n1 = 1234; char *num; char buffer[MAX]; if (asprintf(&num, "%d", n1) == -1) { perror("asprintf"); } else { strcat(strcpy(buffer, str1), num); printf("%s\n", buffer); free(num); } exit(EXIT_SUCCESS); }
đầu ra
Ngoài ra, các cuộc gọi chuỗi có thể được theo sau bởi một lời gọi khác của hàm strcat và nối các chuỗi khác vào bộ đệm #define _GNU_SOURCE #include #include #include #ifndef MAX #define MAX 100 #endif int main(int argc, char *argv[]) { const char* str1 = "hello there"; int n1 = 1234; char *num; char buffer[MAX]; if (asprintf(&num, "%d", n1) == -1) { perror("asprintf"); } else { strcat(strcpy(buffer, "Hello there, "), num); strcat(buffer, "! continued"); printf("%s\n", buffer); free(num); } exit(EXIT_SUCCESS); } 9 đã cho. Lưu ý rằng chúng tôi kiểm tra hàm asprintf để biết giá trị trả về thành công và nếu nó không thành công, thì chúng tôi tiếp tục với quy trình nối
#define _GNU_SOURCE #include #include #include #ifndef MAX #define MAX 100 #endif int main(int argc, char *argv[]) { const char* str1 = "hello there"; int n1 = 1234; char *num; char buffer[MAX]; if (asprintf(&num, "%d", n1) == -1) { perror("asprintf"); } else { strcat(strcpy(buffer, "Hello there, "), num); strcat(buffer, "! continued"); printf("%s\n", buffer); free(num); } exit(EXIT_SUCCESS); }
đầu ra
Hello there, 1234! continued
Sử dụng các hàm asprintf và Hello there, 1234! continued 2 để nối chuỗi và số nguyên trong C
Ngoài ra, có thể sử dụng asprintf kết hợp với Hello there, 1234! continued 2 để nối chuỗi ký tự và int. Hello there, 1234! continued 2 là một phần của các tiện ích chuỗi thư viện chuẩn C được xác định trong tệp tiêu đề Hello there, 1234! continued 7. Phải mất hai con trỏ biểu thị bộ đệm nguồn và đích. Lưu ý rằng các vùng bộ nhớ đệm này không được chồng lên nhau; . Hai đối số cuối cùng đại diện cho ký tự dừng sao chép và số byte tối đa được lấy từ vị trí nguồn. Chúng tôi gọi hàm Hello there, 1234! continued 8 trong phạm vi Hello there, 1234! continued 9 vì nếu không, chúng tôi không thể chắc chắn con trỏ #define _GNU_SOURCE #include #include #include #ifndef MAX #define MAX 100 #endif int main(int argc, char *argv[]) { const char* str1 = "hello there"; int n1 = 1234; char *num; char buffer[MAX]; if (asprintf(&num, "%d", n1) == -1) { perror("asprintf"); } else { memccpy(memccpy(buffer, str1, '\0', MAX) - 1, num, '\0', MAX); printf("%s\n", buffer); free(num); } exit(EXIT_SUCCESS); } 0 là con trỏ hợp lệ